2011-11-14 23 views
3

私は定期的にnullになるDateTime列を持つSQL Serverデータベースに対して作業しています。 LINQ to SQLを使用して、WinForms(VB.NET)プログラムをデータに接続しています。VB.NET - HasValue = FalseでNullable(Of T)を作成する

私はいくつかのLINQオブジェクトを拡張し、いくつかのプロパティを追加しました(Nullable(Of DateTime))。基本的に、私は特定の価値が存在するかどうかを計算しています。値はDateTimeです。存在しない場合はHasValueプロパティがFalseに設定されたNullable(Of DateTime)オブジェクト(構造体など)を作成します。

私はいくつかの研究を行いました。明らかに、Nullable(Of T)のNewコンストラクタはHasValueをTrueに設定して作成します。

つの質問:

  1. これはなぜですか? Nullable(Of T)構造体がこの種の状況に特化して作成されているため、デフォルトの動作はHasValue = Trueとなるのはなぜですか?
  2. Nullable(Of T)を実際にnullに初期化するにはどうすればよいですか?

ありがとう!

答えて

3

Nullableコンストラクタに値を指定すると、与えられた値が返され、HasValueが真であるシナリオが生成されます。

あなたはこれらのアプローチのいずれかを取ることができfalseHasValueとNULL可能宣言する:あなたは、コンストラクタを使用して、値を供給している場合、NULL可能構造体がありません、しかし

Dim x As Nullable(Of DateTime) 
Dim y As DateTime? 

をNULL値、およびそれがHasValueだがtrue次のようになります。

Dim z As New Nullable(Of DateTime)(DateTime.Now) 
2

アフマドの答えは良いです。また、空のコンストラクタもありますが、奇妙なことに、MSDNにそれの痕跡はありません。

Dim x As New Nullable(Of DateTime) 
Debug.Assert(x.HasValue = False) 

期待どおり、HasValueはfalseです。

x = New Date(2011, 1, 1) 
x = Nothing 
Debug.Assert(x.HasValue = False) 
+0

あなたは、これが正しいことを確認しています:あなたが持っている価値を持つのNullable(T)、およびその値を削除したい場合は、それが参照型であるかのように、あなただけの、Nothingにそれを設定したいですか?私は '' Dim x as New Nullable(Of DateTime) 'を使用しようとしていて、 'HasValue = True'と' Value =' 1/1/0001 00:00 'のオブジェクトを戻していたということはほぼ肯定的です。私は間違っていますか? – mbm29414

+0

サンプルコードにDebug.Assertを置く理由があります。このコードを実行し、HasValueが本当にfalseであることをAssertsで保証します;-) –

関連する問題