【问题标题】:Compare Nullable Enum (vb)比较可空枚举 (vb)
【发布时间】:2015-01-07 14:40:00
【问题描述】:

我已经编写了以下代码来执行此操作,但有没有更优雅的方法?

我有 2 个可为空的枚举。我想将它们相互比较,其中一个或两个都可以为空。我必须单独测试是否相等并测试空条件。有没有更好的办法?

Private Class a
    Public Enum MyColour
        Red
        Blue
    End Enum
    Public Property OriginalColour As MyColour?
    Public Property NewColour As MyColour?

    Public ReadOnly Property HasColourChanged As Boolean
        Get
            If (OriginalColour.HasValue And NewColour.HasValue) Then  'Both have values so test
                'Test if the values are the same
                If OriginalColour.Value = NewColour.Value Then
                    Return False
                Else
                    Return True
                End If
            End If

            'Either one or both values are null
            If OriginalColour.HasValue Xor NewColour.HasValue Then
                Return True
            Else
                Return False
            End If
        End Get
    End Property
End Class

【问题讨论】:

  • 您想知道属性何时更改或它们是否不同?因为您的属性只是表明您想知道颜色是否发生了变化
  • 只是好奇,因为如果您关心的只是通知颜色已更改的内容,您应该查看 INotifyPropertyChanged:msdn.microsoft.com/en-us/library/…
  • Google compare nullable 并点击第二个链接。就这么简单。
  • 比尔,我对物业的措辞很糟糕。我想知道它们是否不同。

标签: vb.net enums nullable equality


【解决方案1】:

您可以使用Nullable.Equals 方法。让事情变得简单而美好。

Public ReadOnly Property HasColourChanged As Boolean
    Get
        Return Not Nullable.Equals(OriginalColour, NewColour)
    End Get
End Property

【讨论】:

  • 你链接的方法不是Shared(C#中是static),所以应该是OriginalColour.Equals(NewColour)
  • @Heinzi 糟糕,方法错误。谢谢你把它捡起来。我打算链接到Nullable.Equals<T>,但错误地链接到Nullable<T>.Equals。我已经修复了链接。
【解决方案2】:

您仅针对一个条件返回 false,因此使您的属性默认返回 true,并且仅在满足您的条件时返回 false,这样您就不必检查是否返回 true。所以imo你不需要这么多条件,以下就足够了

Public ReadOnly Property HasColourChanged As Boolean
    Get
        If (OriginalColour.HasValue And NewColour.HasValue) Then  'Both have values so test
            'Test if the values are the same
            If OriginalColour.Value = NewColour.Value Then
                Return False                
        End If

        Return True
    End Get
End Property

【讨论】:

    【解决方案3】:

    我不确定这是否会增加可读性,但我相信您可以使用短路 AndAlso 运算符来缩写此代码以避免潜在的不必要的 RHS 检查,并且还可以使用条件运算符:

    Public ReadOnly Property HasColourChanged As Boolean
        Get
            Return If (OriginalColour.HasValue AndAlso NewColour.HasValue, _
                       Not(OriginalColour.Value = NewColour.Value), _
                       OriginalColour.HasValue Xor NewColour.HasValue)      
        End Get
    End Property
    

    我测试了以下内容:

    Dim test as New a
    test.OriginalColour = MyColour.Red
    test.NewColour = MyColour.Blue
    Debug.Assert(test.HasColourChanged)
    
    test.OriginalColour = MyColour.Blue
    test.NewColour = MyColour.Blue
    Debug.Assert(Not(test.HasColourChanged))
    
    test.OriginalColour = Nothing
    test.NewColour = MyColour.Blue
    Debug.Assert(test.HasColourChanged)
    
    test.OriginalColour = MyColour.Blue
    test.NewColour = Nothing
    Debug.Assert(test.HasColourChanged)
    
    test.OriginalColour = Nothing
    test.NewColour = Nothing
    Debug.Assert(Not(test.HasColourChanged))
    

    【讨论】:

      猜你喜欢
      • 2012-05-04
      • 2010-09-22
      • 2023-03-09
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      相关资源
      最近更新 更多