Vb.net 比较可为空的枚举(vb)

Vb.net 比较可为空的枚举(vb),vb.net,enums,nullable,equality,Vb.net,Enums,Nullable,Equality,我已经编写了以下代码来实现这一点,但是有没有更优雅的方法 我有2个可为空的枚举。我想将它们相互比较,其中一个或两个可以为null。我必须分别测试相等性和空条件。有更好的办法吗 Private Class a Public Enum MyColour Red Blue End Enum Public Property OriginalColour As MyColour? Public Property NewColour As My

我已经编写了以下代码来实现这一点,但是有没有更优雅的方法

我有2个可为空的枚举。我想将它们相互比较,其中一个或两个可以为null。我必须分别测试相等性和空条件。有更好的办法吗

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

您只为一个条件返回false,因此将属性作为默认值返回true,并仅在满足条件时返回false,这样您就不必检查是否返回true。所以在我看来,你不需要那么多的条件,下面的就足够了

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

我不确定这是否会增加可读性,但我相信您可以使用short-circuit
和also
运算符来缩写此代码,以避免潜在的不必要的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))
你可以使用这个方法。保持事物的美好和简单

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

您想知道属性何时更改还是不同?因为您的属性只是表示您想知道颜色是否发生了变化,这只是出于好奇,因为如果您所关心的只是通知某个颜色发生了变化,那么您应该查看INotifyPropertyChanged:Duplicate of Google
compare nullable
,然后单击第二个链接。就这么简单。比尔,我把房子写得很糟糕。我想知道它们是否不同。你链接到的方法不是共享的(C#中的静态),所以应该是原始颜色。等于(新颜色)@Heinzi-Oops,错误的方法。谢谢你把它捡起来。我本想链接到
Nullable.Equals
,但错误地链接到
Nullable.Equals
。我已经修好了链接。