将date变量设置为null

时间:2015-09-28 11:04:37

标签: sql vb.net

 Dim dtIzvrsenja datetime
Private Sub chkDate_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkDate.CheckedChanged
        If Me.chkDate.Checked Then
            Me.dtpDate.CustomFormat = "dd.MM.yyyy"
            Me.dtpDate.Enabled = True
            dtIzvrsenja = dtpdate.value
        Else
            Me.dtpDate.CustomFormat = " "
            Me.dtpDate.Enabled = False
            dtIzvrsenja = Nothing
        End If
    End Sub

如果未检查chk,有没有办法将dtIzvrsenja的值设置为null?

使用其他提及的方式进行编辑。

  

{" Nullable对象必须有一个值。"}

  Dim dtIzvrsenja2 As DateTime? = Nothing
            dtIzvrsenja = dtIzvrsenja2

3 个答案:

答案 0 :(得分:0)

使用Nullable

Dim nullableDateValue As New Nullable(Of Date) = Nothing

答案 1 :(得分:0)

你也可以使用问号(Nullable)说明符,虽然这可能已经过时了......

Dim dtIzvrsenja As DateTime? = Nothing

答案 2 :(得分:0)

为了支持这一点,您需要使用通用Nullable(Of Date)类型而不仅仅是DateDateTime类型的VB别名)。通常,只有引用类型变量(Class类型变量)支持空值。由于Date值类型变量(Structure),因此它不支持null。 Nullable(Of T)允许您包装任何值类型,并将null值的支持添加到该类型。

在VB(以及C#,顺便说一句)中,任何类型名称后面的问号都是使类型可为空的简写。因此,Date?相当于Nullable(Of Date)。这是使用nullables的示例代码:

Dim dtIzvrsenja As Date?
Private Sub chkDate_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkDate.CheckedChanged
    If Me.chkDate.Checked Then
        Me.dtpDate.CustomFormat = "dd.MM.yyyy"
        Me.dtpDate.Enabled = True
        dtIzvrsenja = dtpdate.value
    Else
        Me.dtpDate.CustomFormat = " "
        Me.dtpDate.Enabled = False
        dtIzvrsenja = Nothing
    End If
End Sub

然而,关于Nullable(Of T)的令人困惑的事情是它本身不是引用类型Nullable(Of T)值类型。因此,即使Nullable(Of Date)变量也不能在传统意义上设置为null。 Nullable(Of T)的作用是添加HasValue As Boolean属性,允许您检查值是否为空。因此,当您去读取变量的值时,而不是首先检查变量Is Nothing,而是需要检查它的HasValue属性是否为真。例如:

If dtIzvrsenja.HasValue Then
    Dim dtIzvrsenja2 As Date = dtIzvrsenja.Value
    ' ...
End If

如果您确实希望将Date类型视为实际引用类型,则可以通过声明变量As Object来实现。 Object变量始终是引用变量,因此当设置为Nothing时,它们实际上设置为null。当您将Object变量设置为值类型值(例如Date)时,它将该值。当您读取它的值并将其转换回Date时,它将经历一个名为拆箱的过程。但是,这个装箱/拆箱进程会增加一些开销。此外,另一个缺点是在编译时将跳过使用Object变量的代码的类型检查。这意味着,如果您不小心,如果变量引用的是与您期望的不同的对象类型,则可以在运行时获得一些异常。您可以通过声明自己的类来避免类型检查问题:

Public Class DateReference
    Public Property Value As Date
End Class

或者:

Public Class Reference(Of T)
    Public Property Value As T
End Class

然而,这似乎很愚蠢。 Nullable(Of T)已经达到了这个目的,所以除非你真的需要把它作为参考类型,否则我建议你花点时间熟悉标准的做法。

作为旁注,另一个引起混淆的复杂因素是VB的Nothing关键字并不严格意味着为空。它只是意味着任何类型的愚蠢价值。因此,对于IntegerNothing等于零值。对于Date,它表示Date.MinValue等。