在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.
答案 0 :(得分:130)
这是与VB.Net,IMO混淆的最大原因之一。
VB.Net中的 Nothing
相当于C#中的default(T)
:给定类型的默认值。
0
为Integer
,False
为Boolean
,{{1}为DateTime.MinValue
,},DateTime
值(引用的引用,没有任何内容)。语句null
因此等同于d Is Nothing
,显然无法编译。
解决方案:正如其他人所说的那样
d Is DateTime.MinValue
(即DateTime?
)。这是我的首选解决方案。Nullable(Of DateTime)
或等效d = DateTime.MinValue
在原始代码的上下文中,您可以使用:
d = Nothing
上找到更全面的解释
答案 1 :(得分:10)
DateTime是一种值类型,这就是它不能为空的原因。您可以检查它是否等于DateTime.MinValue
,或者您可以使用Nullable(Of DateTime)
代替。
有关值类型与参考类型的广泛讨论,请参阅this question。
答案 2 :(得分:3)
DateTime是值类型,这意味着它总是有一些值。
它就像一个整数 - 它可以是0,或1,或小于零,但它永远不会是“无”。
如果你想要一个可以取Nothing值的DateTime,请使用Nullable DateTime。
答案 3 :(得分:3)
使用可空DateTime
值的一些示例。
(有关详情,请参阅Nullable Value Types (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 (来自Nothing (Visual Basic)):
检查引用(或可空值类型)变量是否为 null 时,请勿使用= Nothing
或<> Nothing
。始终使用Is Nothing
或IsNot Nothing
。
答案 4 :(得分:1)
在任何编程语言中,使用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
然后你可以挑选并选择可覆盖的东西,让它做你需要的。很多工作 - 但如果你真的需要它,你可以做到。
答案 5 :(得分:1)
您也可以使用以下简单的方法来检查:
If startDate <> Nothing Then
your logic
End If
它将检查DateTime数据类型的startDate变量是否为null。
答案 6 :(得分:0)
解决这个问题的方法是使用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
答案 7 :(得分:0)
您可以查看以下内容:
if varDate = "#01/01/0001#" then
' blank date. do something.
else
' Date is not blank. Do some other thing
end if