将日期变量设置为空
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?将日期变量设置为空
使用其他提到的方式进行编辑。
{ “可空对象必须有一个值。”}
Dim dtIzvrsenja2 As DateTime? = Nothing
dtIzvrsenja = dtIzvrsenja2
为了支持这一点,您需要使用通用的Nullable(Of Date)
类型,而不仅仅是Date
(DateTime
类型的VB别名)。通常,只有参考类型变量(Class
类型变量)支持空值。由于Date
是值类型变量(Structure
),因此它不支持空值。 Nullable(Of T)
允许您包装任何值类型并向该类型添加对空值的支持。
在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)
变量不能在传统意义上设置为空。 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
等。
使用Nullable
:
Dim nullableDateValue As New Nullable(Of Date) = Nothing
但是,如果用户选中并取消选中该复选框,该怎么办。我无法再声明 - – myString