#vb.net #enums #comparison-operators
#vb.net #перечисления #операторы сравнения
Вопрос:
В VB.Net , я обычно создаю перечисления следующим образом:
Private Enum Zone
IsNegative = -3
IsBad = -2
IsError = -1
Undefined = 0 ' or Unknown, Nothing...
Value1
Value2
ValueN
End Enum
Похоже, это соответствует рекомендациям по проектированию Enum Framework.
Недавно я начал следить за тем, чтобы также значению Undefined
or Nothing
присваивалось значение 0, чтобы сравнения, подобные следующему, работали правильно:
Dim enu as Zone
If enu = Nothing Then ...
Nothing
равно 0, это соответствует значению Nothing
или Undefined
Enum
.
Часто, и потому, что я всегда присваиваю отрицательные значения ошибочным, неправильным или каким-то неправильным значениям, я также выполняю сравнения, такие как:
If enu > 0 Then
' Perform something with the Zone Enum knowing it's a correct value
Else
' Handle the Enum error or correct its value
End If
Это позволяет проверять все значения перечисления, которые хороши сразу.
Это хорошая практика, или я никогда не должен сравнивать перечисление численно? Есть ли причины, по которым этого следует избегать?
Комментарии:
1. Вы можете использовать степени 2 для некоторых или всех ваших полей, и тогда все поля, которые в настоящее время имеют отрицательные значения, могут включать ту же степень 2. Затем вы могли бы найти эту конкретную степень 2, и она соответствовала бы нескольким значениям.
2.
Dim enu As Zone = Nothing
совпадает сZone enu = defau<
версией C #. Так что никаких проблем с этим или сравнением со значениями<=> 0
(то же самое относится и к C #). Вы могли бы быть явными и заданнымиPrivate Enum Zone As Integer
(хотя это тоже по умолчанию).
Ответ №1:
Перечисление — это скорее систематический подход к стилю использования известных значений. Ваш способ не ошибочен, но вместо этого вы все равно можете использовать константы или некоторые другие переменные или прямые значения, но для удобства чтения и удобства сопровождения кода рекомендуется использовать enum так, как следует использовать счетчики.
If yourvalue = enu.Undefined then ...
Комментарии:
1. Действительно, но это работает только для отдельных значений. Я не знаю лучшего способа, чем то, что я изложил в своем вопросе, для сравнения с группой
Enum
значений.If Not SomeValue = enu.Value1 And Not SomeValue = enu.Value2 And Not ...
довольно громоздко.2. см. Enum . IsDefined() . Надеюсь, это поможет.