Переопределение int на немного enum - PullRequest
0 голосов
/ 27 февраля 2009

Я видел некоторый код .NET 2.0, который выглядел так:

 public enum abc : int
 {
  value1 = 1,
  value2 = 2,
  value3 = 4
 }

и т.д ...

Теперь я знаю, что перечисление flags можно использовать для битовых значений (как выше, верно?), Поэтому вы можете сделать | "или" & и т. д., но в чем причина не использовать это? Какой смысл переопределять int?

Если бы я разработал перечисление для выбора нескольких значений, я бы использовал атрибут flags и ничего не переписывал (чего я не понимаю). Что вышеупомянутый подход чистый?

Спасибо

Ответы [ 7 ]

9 голосов
/ 27 февраля 2009

Это не "переопределение" int, это указывает, на каком типе основано перечисление. По умолчанию это int, так что на самом деле это ничего не дает, но в некоторых случаях вам может потребоваться основать перечисление на long для хранения большего количества флагов или byte для экономии места, если будет очень много экземпляров перечисление вокруг, и оно имеет только несколько значений, однако рекомендация в руководящих принципах разработки структуры должна использовать int, если у вас нет очень веских причин не делать это.

Если это предназначено для перечисления флагов, то оно должно быть помечено [Flags], и это, как представляется, является намерением, поэтому упущение выглядит как ошибка. Вы все еще можете комбинировать значения, используя побитовые операторы, даже если они не помечены [Flags], но из памяти я думаю, что вы получаете предупреждение компилятора (или это может быть предупреждение FxCop или, возможно, предупреждение ReSharper ...) .

2 голосов
/ 27 февраля 2009

FlagsAttribute только сообщает пользователю, что поля в этом перечислении могут быть объединены; это фактически не устанавливает поля перечисления в «flaggable» значения. Это вам придется делать самому, как вы уже это сделали.

2 голосов
/ 27 февраля 2009

": int" указывает, что использовать в качестве базового типа для значений перечисления; Здесь можно использовать любой тип, отличный от char. По умолчанию используется значение int, поэтому в данном случае оно является избыточным.

0 голосов
/ 27 февраля 2009

В отношении ": int", определяющего базовый тип, если бы я увидел это, я бы осмотрелся и посмотрел, не исключают ли они все свои перечисления таким образом. Если так, то они, вероятно, только что научились писать перечисления таким образом (или, может быть, они являются гипер-явным кодером). Однако, если только это перечисление было объявлено таким образом, возможно, программист пытается что-то сказать (что могло бы быть лучше сказано с комментарием), что важно, чтобы это имело базовый тип «int». Возможно, он где-то сериализован или десериализован в двоичном формате.

Что касается атрибута [Flags], то, что касается C #, вы можете использовать побитовые операторы для любого перечисления, а не только для тех, которые объявлены с [Flags]. Из приведенного выше примера, без каких-либо флагов, абсолютно законно следующее:

abc myAbcValue = значение1 | значение2;

Основное отличие от [Flags] заключается в методах ToString () и Parse () Enum. Без [Flags] myAbvValue.ToString () вернет «3», но с [Flags] вернет «значение1, значение2». Аналогично с [Флаги],

abc yourAbcValue = (abc) Enum.Parse (typeof (abc), "value1, value2");

установит базовое значение yourAbcValue в 3.

Обратите внимание, что метод IsDefined () функции Enum () не допускает использование нескольких значений с перечислениями [Flags], поэтому:

Enum.IsDefined (typeof (abc), "value1, value2")

возвращает false независимо от использования [Flags].

Также обратите внимание, что [Flags] предоставляет информацию для любого доступа к отражению, а другие языки могут трактовать ограничение помеченных перечислений иначе, чем обычные перечисления.

0 голосов
/ 27 февраля 2009

Установка значений для перечисления не-Flags для использования кодирования 1-hot только ради использования кодирования 1-hot не имеет никакого смысла. Я думаю, это может иметь смысл, если вы думаете, что можете сделать это перечислением Flags в будущем. В противном случае значения должны быть либо не переопределены, либо назначены значения на основе их значения (например, Color.Red = 0xFF0000).

0 голосов
/ 27 февраля 2009

Если вы запрашиваете сценарий для выбора конкретных значений, я не знаю хорошего примера, но могу представить что-то вроде

enum Color = {
  Red = 0xFF0000,
  Green = 0x00FF00,
  Blue = 0x0000FF }

может быть полезным.

0 голосов
/ 27 февраля 2009

Я не вижу никакой пользы. Возможно отсутствие опыта со стороны программиста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...