在VB.net中比较可空的DateTime类型

5
我是一名C#/ASP.NET开发人员,现在需要处理VB/ASP.NET相关的工作。我曾经学过VB.NET,但离开它已有多年,现在语法已经让我感到困惑。
我有两个变量:
Dim originalDate as DateTime?
Dim newDate as DateTime?

两个可空的日期时间,originalDate是我从数据库中获取的可空日期,newDate是在代码中设置的时间,我需要比较它们,它们可以同时有日期,也可以同时没有日期,或者一个有日期,另一个没有。

我有以下代码:

if origEndDate = origEndDate then

当origEndDate和origEndDate都为“nothing”时,此语句为假(在观察窗口中运行时返回为“nothing”)!

我不明白为什么会这样,因为我的理解是,“=”比较两个值,而且它们相同,肯定应该是真的吧?

有人能解释一下我做错了什么吗?在C#中,我可以这样做:

if (origEndDate == origEndDate) { }

它将返回true。

感到困惑!

谢谢任何帮助!

5个回答

5

也许可以尝试使用originalDate.Equals(newDate)

(不会在任何一个日期为空时导致NRE,因为这些变量实际上是值类型Nullable(Of DateTime),因此只有在装箱之前它们才会真正成为空。)


空引用异常。我会使用这种方法,因为它将使用Nullable(Of DateTime)类型上的重载,这比使用默认的基于反射的值类型比较更快。 - cdhowie
有道理!但是为什么直接使用“=”在C#中不像在其他语言中一样起作用(在C#中需要使用“==”)? - Bex
如果要在 VB.NET 中检查某个东西是否为空(nothing),你需要这样做:if obj is nothing - Fredou
使用可空对象,您可以尝试 .hasvalue 来确定是否设置了任何内容。 - Fredou
让我们不要开始语言战争 :-p,最终,它是CLR :-) - Fredou
显示剩余3条评论

2
使用 GetValueOrDefault 方法可以处理两个日期都为空的情况。
Dim d1 As New Nullable(Of DateTime)
Dim d2 As New Nullable(Of DateTime)
If d1.GetValueOrDefault = d2.GetValueOrDefault Then
  {do stuff}
End If

否则,您可以检查HasValue的组合,以确定日期未定义。
If (Not d1.HasValue AndAlso Not d1.HasValue) OrElse (d1.HasValue AndAlso d2.HasValue AndAlso d1 = d2) Then
  {do stuff}
End If

那么整数可空类型的默认值是什么?是0吗?这是否意味着如果我的对象没有值,我在使用GetValueOrDefault时会得到一个0? - Marko

2

使用 object.equals(originalDate ,newDate) 方法


1
这个代码可以工作,但下面的答案也可以,那么在这种情况下,原始日期和新日期的变量类型有什么区别吗?换句话说,我能否在其他地方使用它,还是只能用于可空类型? - Bex
1
@Bex,我需要用反射器查看日期类型的.Equals是如何工作的,但我认为它只是调用Object.Equals,Object.Equals可以使用任何类型的对象。 - Fredou
1
object.Equals 在任何情况下都能工作。只有在其中一个参数可能为空时(除了未装箱的可空类型,其实际上永远不会为空的情况除外),您才真正需要它。否则,在对象中使用.Equals()方法会稍微更快一些。 - cdhowie
谢谢你们两位的帮助!听起来下面那个是答案...但在我标记之前,我会用几个值进行一些测试。 - Bex

1

我发现Date.Equals可以用于相等性比较,但是没有其他运算符的方法(例如<或>)。

如果您需要进行大于或小于的比较,则需要使用:

If Date1.GetValueOrDefault > Date2.GetValueOrDefault Then
    ...
End If

我决定为了保持一致性而将所有代码标准化为使用这种方法。 现在,我的相等性检查具有与上面示例相同的格式:

If Date1.GetValueOrDefault = Date2.GetValueOrDefault Then
    ...
End If

1

当你需要知道两个可空对象是否相等时,请使用可空类方法

Dim d1 As New Nullable(Of DateTime)
Dim d2 As New Nullable(Of DateTime)
Dim result As String = "Not Equal"
If( Nullable.Equals(d1,d2))
    result = "Equal"
End If

还可以检查大于、小于

Dim compareResult As Integer
compareResult = Nullable.Compare(d1,d2)
If(compareResult > 0)
    result = "d1 greater than d2"
Else If (compareResult < 0)
    result = "d1 less than d2"
Else
    result = "d1 equal d2"
End If

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接