C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 構造体の中身が空かどうか調べたい


(過去ログ 98 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■58674 / inTopicNo.1)  構造体の中身が空かどうか調べたい
  
□投稿者/ バーバラ (1回)-(2011/04/21(Thu) 19:56:33)

分類:[VB.NET/VB2005 以降] 

(環境 VB2008)
以下のサイトを参考に、構造体のListを利用して、構造体の特定のパラメータにある値がセットされているものを取り出そうとしています。
http://hpcgi1.nifty.com/MADIA/vbnet/wwwlng.cgi?print+200907/09070015.txt

'≪A:該当する Stru1 を 1 つ取得≫
'Find メソッド
' 複数該当する場合は、最初に一致した Stru1 構造体。
' 該当項目が無い時は、空の Stru1 構造体。
Dim dstFirstStru1 As Stru1 = srcList.Find(Function(x) x.Value2 = targetValue)

上記のFindを使うと、該当項目がない場合には空の構造体が返ってきますが、
構造体が空かどうかを簡単に調べるにはどうすればよいでしょうか?
構造体でなくクラスなら、Nothingが返ってくるのでIs Nothingで判別できるのですが。
文字列やIntegerのデータを格納するだけなので、クラスにする必要はないと考えているのですが、
このような場合は構造体でなくクラスを用いた方がいいのでしょうか?
引用返信 編集キー/
■58675 / inTopicNo.2)  Re[1]: 構造体の中身が空かどうか調べたい
□投稿者/ 魔界の仮面弁士 (2153回)-(2011/04/21(Thu) 22:15:11)
No58674 (バーバラ さん) に返信
> 構造体が空かどうかを簡単に調べるにはどうすればよいでしょうか?

方法の一つしては、Nothing と値比較するという手法があります。
 If CType(Nothing, Stru1).Equals(dstFirstStru1) Then
  '空
 Else
  '発見
 End If

ただし「空の構造体」は、値ゼロと区別がつきません。

たとえば、Int32 構造体(Integer 型) の空値は「0」ですし、
DateTime 構造体(Date 型)の空値は「Date.MinValue」(0001/01/01 00:00:00.0000000)で、
Point 構造体の空値は「Point.Empty」(X = 0, Y = 0)です。


「該当項目無し」の状態を、こうした「値ゼロ」と同一視しても構わないのであれば、
Point 構造体や Color 構造体のように、あらかじめ「IsEmpty プロパティ」を
用意しておくと便利かも知れません。
 If Stru1.IsEmpty Then
  '空
 Else
  '発見
 End If


逆に、「該当項目なし」と「値ゼロ」を区別したいのであれば、
 ・List(Of T).Find ではなく List(Of T).FindIndex を使う。
 ・null 許容値型にして、Nothing 判定を行う。
などといった対処が必要でしょう。
(null 許容型の場合は、SingleOrDefault 拡張メソッドでの検索もできます)
引用返信 編集キー/
■58676 / inTopicNo.3)  Re[1]: 構造体の中身が空かどうか調べたい
□投稿者/ shu (642回)-(2011/04/21(Thu) 22:19:44)
No58674 (バーバラ さん) に返信

boolean型のフィールドを用意しnewでこのフィールドをTrueに設定。
構造体を作成するときは必ずnewを通すということにしておけば、
Findで見つからなかったNothingの場合、boolean型のフィールドはFalse
なので判別することが出来ます。この追加フィールドは外からはいじらない事。
いろいろルールがありますがなんとかこれで判定できると思います。
引用返信 編集キー/
■58680 / inTopicNo.4)  Re[2]: 構造体の中身が空かどうか調べたい
□投稿者/ todo (138回)-(2011/04/22(Fri) 10:27:29)
2011/04/22(Fri) 10:28:35 編集(投稿者)

>文字列やIntegerのデータを格納するだけなので、クラスにする必要はないと考えているのですが、
>このような場合は構造体でなくクラスを用いた方がいいのでしょうか?

はい。
特に、Listで保持するならクラスにした方が断然よいです。

構造体とクラス
http://msdn.microsoft.com/ja-jp/library/2hkbth2a(VS.80).aspx

クラスまたは構造体の選択
http://msdn.microsoft.com/ja-jp/library/ms229017.aspx

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -