在VB中。NET,是否有办法将DateTime
变量设置为"不设置"?为什么可以将DateTime
设置为Nothing
,但不可以检查它是否为Nothing
?例如:
Dim d As DateTime = Nothing
Dim boolNotSet As Boolean = d Is Nothing
第二个语句抛出这个错误:
'Is' operator does not accept operands of type 'Date'. Operands must be reference or
nullable types.
这是VB最大的混淆来源之一。净,国际海事组织。
Nothing
在VB。Net相当于c#中的default
:给定类型的默认值。
- 对于值类型,这基本上相当于' 0 ':
0
用于Integer
,False
用于Boolean
,DateTime.MinValue
用于DateTime
,… - 对于引用类型,它是
null
值(一个引用,好吧,什么都没有)。
语句d Is Nothing
因此等同于d Is DateTime.MinValue
,显然不能编译。
解决方案:如其他人所说
- 使用
DateTime?
(即Nullable(Of DateTime)
)。这是我的首选解决方案。 - 或使用
d = DateTime.MinValue
或同等d = Nothing
在原始代码的上下文中,您可以使用:
Dim d As DateTime? = Nothing
Dim boolNotSet As Boolean = Not d.HasValue
更全面的解释可以在Anthony D. Green的博客
DateTime是一个值类型,这就是为什么它不能为空。您可以检查它是否等于DateTime.MinValue
,或者您可以使用Nullable(Of DateTime)
代替。
VB有时"有用地"让你认为它在做一些它没有做的事情。当它让你设置日期为0时,它实际上是将它设置为其他值,可能是MinValue。
DateTime是一个值类型,这意味着它总是有一些值。
它就像一个整数——它可以是0、1或小于0,但它永远不可能是"无"。
如果你想要一个DateTime可以接受值Nothing,使用一个Nullable DateTime
使用可空DateTime
值的一些示例。
(更多信息请参见可空值类型(Visual Basic))
'
' An ordinary DateTime declaration. It is *not* nullable. Setting it to
' 'Nothing' actually results in a non-null value.
'
Dim d1 As DateTime = Nothing
Console.WriteLine(String.Format("d1 = [{0}]n", d1))
' Output: d1 = [1/1/0001 12:00:00 AM]
' Console.WriteLine(String.Format("d1 is Nothing? [{0}]n", (d1 Is Nothing)))
'
' Compilation error on above expression '(d1 Is Nothing)':
'
' 'Is' operator does not accept operands of type 'Date'.
' Operands must be reference or nullable types.
'
' Three different but equivalent ways to declare a DateTime
' nullable:
'
Dim d2? As DateTime = Nothing
Console.WriteLine(String.Format("d2 = [{0}][{1}]n", d2, (d2 Is Nothing)))
' Output: d2 = [][True]
Dim d3 As DateTime? = Nothing
Console.WriteLine(String.Format("d3 = [{0}][{1}]n", d3, (d3 Is Nothing)))
' Output: d3 = [][True]
Dim d4 As Nullable(Of DateTime) = Nothing
Console.WriteLine(String.Format("d4 = [{0}][{1}]n", d4, (d4 Is Nothing)))
' Output: d4 = [][True]
另外,关于如何检查变量是否为null (from Nothing (Visual Basic)):
当检查引用(或可空值类型)变量是否为null时,不要使用= Nothing
或<> Nothing
。始终使用Is Nothing
或IsNot Nothing
。
在任何编程语言中,使用null时都要小心。上面的例子显示了另一个问题。如果你使用Nullable类型,这意味着从该类型实例化的变量可以保存值System.DBNull.Value;并不是说它改变了使用"= Nothing"将值设置为默认值的解释,也不是说该值的Object现在可以支持空引用。只是一个警告……编码快乐!
您可以创建一个包含值类型的单独类。从这样一个类创建的对象将是一个引用类型,它可以被赋值为Nothing。一个例子:
Public Class DateTimeNullable
Private _value As DateTime
'properties
Public Property Value() As DateTime
Get
Return _value
End Get
Set(ByVal value As DateTime)
_value = value
End Set
End Property
'constructors
Public Sub New()
Value = DateTime.MinValue
End Sub
Public Sub New(ByVal dt As DateTime)
Value = dt
End Sub
'overridables
Public Overrides Function ToString() As String
Return Value.ToString()
End Function
结束课
' Main ():
Dim dtn As DateTimeNullable = Nothing
Dim strTest1 As String = "Falied"
Dim strTest2 As String = "Failed"
If dtn Is Nothing Then strTest1 = "Succeeded"
dtn = New DateTimeNullable(DateTime.Now)
If dtn Is Nothing Then strTest2 = "Succeeded"
Console.WriteLine("test1: " & strTest1)
Console.WriteLine("test2: " & strTest2)
Console.WriteLine(".ToString() = " & dtn.ToString())
Console.WriteLine(".Value.ToString() = " & dtn.Value.ToString())
Console.ReadKey()
' Output:
'test1: Succeeded()
'test2: Failed()
'.ToString() = 4/10/2012 11:28:10 AM
'.Value.ToString() = 4/10/2012 11:28:10 AM
然后你可以选择可重写的,使它做你需要的。很多工作,但如果你真的需要,你可以做到。
您也可以使用下面的简单代码进行检查:
If startDate <> Nothing Then
your logic
End If
检查DateTime数据类型的startDate变量是否为空
你可以这样检查:
if varDate = "#01/01/0001#" then
' blank date. do something.
else
' Date is not blank. Do some other thing
end if
解决这个问题的方法是使用Object数据类型:
Private _myDate As Object
Private Property MyDate As Date
Get
If IsNothing(_myDate) Then Return Nothing
Return CDate(_myDate)
End Get
Set(value As Date)
If date = Nothing Then
_myDate = Nothing
Return
End If
_myDate = value
End Set
End Property
那么你可以将日期设置为如下所示:
MyDate = Nothing
Dim theDate As Date = MyDate
If theDate = Nothing Then
'date is nothing
End If