【问题标题】:Comparing nullable DateTime's in VB.net在 VB.net 中比较可为空的 DateTime
【发布时间】:2010-11-17 16:03:45
【问题描述】:

我是一名 c#/asp.net 开发人员,我必须在 VB/asp.net 上工作。 我从 VB.NET 开始,但多年后我对它的语法感到困惑。

我有两个变量

Dim originalDate as DateTime?
Dim newDate as DateTime?

两个可以为空的日期时间,originalDate 是我从数据库中获取的一个可以为空的日期,并且 newDate 时间是在代码中设置的,我需要比较它们,它们要么都有日期,要么没有日期,要么一个有一个没有。

我有一段代码如下:

if origEndDate = origEndDate then

当 origEndDate 和 origEndDate 都是“无”时,此语句为假(当我在监视窗口中运行它时,它返回无)!

我不明白为什么会这样,因为我的印象是做一个“=”比较两个值,因为它们是相同的,所以它应该是真的吗?

有人可以解释我做错了什么吗?我应该在 C# 中使用什么语法我可以这样做:

if (origEndDate == origEndDate) { }

它会返回真实的。

困惑!

感谢您的帮助!

【问题讨论】:

    标签: c# asp.net vb.net


    【解决方案1】:

    试试originalDate.Equals(newDate)好吗?

    (不,当任一日期为空时,这不会导致 NRE,因为变量实际上是 值类型 Nullable(Of DateTime),因此 实际上 不为空直到他们被装箱。)

    【讨论】:

    • 什么是 NRE?这个方法和 object.equals(originalDate ,newDate) 都有效..我应该使用哪个?
    • NullReferenceException。我会使用这种方法,因为它将使用 Nullable(Of DateTime) 类型的覆盖,这将比使用默认的基于反射的值类型比较更快。
    • 有道理..!但是为什么直截了当的“=”不能像在 c# 中那样工作(好吧 == 在 c# 中)?
    • @Bex,在 vb.net 下,检查某些东西是否为空(无)你需要做的:如果 obj 什么都没有,那么
    • 或者,对于可为空的对象,您可以尝试 .hasvalue 以了解是否设置了任何内容
    【解决方案2】:

    使用 object.equals(originalDate ,newDate )

    【讨论】:

    • 这行得通,但下面的答案也行得通,在这种情况下,originalDate 和 newDate 是什么类型的变量是否有任何区别,因为我可以在其他地方使用它还是仅用于可空值?
    • @Bex,我需要使用反射器查看日期类型的 .Equals 是如何工作的,但我认为它只是调用 Object.Equals,Object.Equals 可以与任何类型的对象一起使用
    • object.Equals 在任何情况下都可以使用。只有当任一参数可能为空时,您才真正需要它(除非是未装箱的可空对象,它们永远不会实际上为空)。否则,对其中一个对象使用.Equals() 方法会稍微快一些。
    • 感谢您的帮助!听起来下面的答案就是答案。但在标记一个值之前,我会用一些值进行一些测试。
    【解决方案3】:

    使用 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
    

    【讨论】:

    • 那么 Integer 可为空的默认值是多少? 0?这是否意味着如果我的对象没有值,我在使用 GetValueOrDefault 时会得到 0?
    【解决方案4】:

    我发现 Date.Equals 确实适用于相等,但没有任何方法适用于其他运算符(例如 )。

    如果您需要比较大于或小于您需要使用的值:

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

    为了保持一致性,我决定标准化我的所有代码以使用这种方法。 所以现在我的相等检查的格式和上面的例子一样:

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

    【讨论】:

      【解决方案5】:

      当您需要知道两个 Nullable 是否相等时,请使用 Nullable Class methods

      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
      

      【讨论】:

        猜你喜欢
        • 2012-09-17
        • 1970-01-01
        • 1970-01-01
        • 2013-07-28
        • 2020-09-15
        • 2011-01-11
        • 2016-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多