Сравнить Nullable Enum (vb)

Я написал для этого следующий код, но есть ли более элегантный способ?

У меня есть 2 обнуляемых Enum. Я хочу сравнить их друг с другом, где один или оба могут быть нулевыми. Я должен отдельно проверить равенство и проверить нулевое условие. Есть ли способ лучше?

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

person Coding123456    schedule 07.01.2015    source источник
comment
Вы хотите знать, когда недвижимость изменится или изменится? Потому что ваша собственность просто указывает, что вы хотите знать, изменился ли цвет   -  person Bill Dinger    schedule 07.01.2015
comment
Просто любопытно, потому что если все, что вас волнует, - это уведомить что-то об изменении цвета, вы должны проверить INotifyPropertyChanged: msdn.microsoft.com/en-us/library/   -  person Bill Dinger    schedule 07.01.2015
comment
Дубликат Как сравнить типы, допускающие значение NULL?   -  person Bjørn-Roger Kringsjå    schedule 07.01.2015
comment
Google compare nullable и нажмите вторую ссылку. Это так просто.   -  person Bjørn-Roger Kringsjå    schedule 07.01.2015
comment
Билл, я плохо описал собственность. Я хотел знать, были ли они другими.   -  person Coding123456    schedule 08.01.2015


Ответы (3)


Вы можете использовать Nullable.Equals метод. Делает вещи красивыми и простыми.

Public ReadOnly Property HasColourChanged As Boolean
    Get
        Return Not Nullable.Equals(OriginalColour, NewColour)
    End Get
End Property
person reduckted    schedule 07.01.2015
comment
Метод, с которым вы связались, не Shared (static в C #), поэтому он должен быть OriginalColour.Equals(NewColour). - person Heinzi; 07.01.2015
comment
@Heinzi Ой, неправильный метод. Спасибо, что подняли это. Я имел в виду ссылку на Nullable.Equals<T>, но по ошибке был связан с Nullable<T>.Equals. Я исправил ссылку. - person reduckted; 07.01.2015

Вы возвращаете 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
person Codeek    schedule 07.01.2015

Я не уверен, что это улучшает читаемость, но я считаю, что вы можете сократить этот код, используя оператор короткого замыкания 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))
person StuartLC    schedule 07.01.2015