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
答案 0 :(得分:0)
使用Nullable
:
Dim nullableDateValue As New Nullable(Of Date) = Nothing
答案 1 :(得分:0)
你也可以使用问号(Nullable)说明符,虽然这可能已经过时了......
Dim dtIzvrsenja As DateTime? = Nothing
答案 2 :(得分:0)
为了支持这一点,您需要使用通用Nullable(Of Date)
类型而不仅仅是Date
(DateTime
类型的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
关键字并不严格意味着为空。它只是意味着任何类型的愚蠢价值。因此,对于Integer
,Nothing
等于零值。对于Date
,它表示Date.MinValue
等。