VB.NET - 使用HasValue = False创建Nullable(Of T)

时间:2011-11-14 19:32:57

标签: sql-server vb.net linq-to-sql datetime nullable

我正在攻击SQL Server数据库,该数据库通常具有可以为null的DateTime列。我正在使用LINQ to SQL将我的WinForms(VB.NET)程序连接到数据。

我扩展了一些LINQ对象并添加了几个Nullable(Of DateTime)属性。基本上,我正在计算是否存在特定值。该值为DateTime。如果它不存在,我想创建一个Nullable(Of DateTime)对象(结构,无论如何),HasValue属性设置为False

我做了一些研究,显然,Nullable(Of T)上的新构造函数会创建一个HasValue设置为True的构造函数。

两个问题:

  1. 这是为什么?由于Nullable(Of T)结构是专门针对此类情况创建的,为什么默认行为为HasValue = True
  2. Nullable(Of T)初始化为null的最佳方式是什么?
  3. 谢谢!

2 个答案:

答案 0 :(得分:3)

如果您正在为Nullable构造函数提供值,那么它将具有给定值,这将导致您描述HasValue为真的场景。

要使用HasValue false声明可空,您可以选择其中一种方法:

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

但是,如果您正在使用构造函数并提供值,则可空结构将不具有空值,并且HasValue将为true

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

答案 1 :(得分:2)

艾哈迈德的回答很好。还有一个空构造函数,即使奇怪的是,在MSDN上没有它的痕迹:

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

正如所料,HasValue是假的。如果你有一个带有值的Nullable(T),并想要删除该值,你只需将其设置为Nothing,就好像它是一个引用类型:

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