Можно ли использовать операторы сравнения для значений перечисления?

#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() . Надеюсь, это поможет.