Не уникальные значения enums

Я пытаюсь затенять позиции индекса в файле edi … У меня была ситуация, когда 2 или 3 вещи могли быть в индексе, основанном на ситуации. Было бы здорово использовать перечисление, чтобы скрыть «магические числа», и был удивлен, увидев, что вы можете присвоить несколько перечислений тому же значению, как это:

public enum Color { Red = 1, Blue = 1, Green = 1 } 

и компилятор этому доволен. Я не ожидал, что это сработает. Мне не нужно возвращаться к перечислению, поэтому я не беспокоюсь о том, чтобы попытаться вернуться, но это пахнет . Почему CLR допускает несколько значений для перечислений, и я должен использовать для этого структуру? (Структура казалась более тяжелой, чем переименование, и это, похоже, работает)

На самом деле, вы уже определяете структуру … За кулисами enum – это просто структура (но которая происходит из System.Enum), а значения enums определяются как константы (вы можете проверить это с помощью ILDASM).

Ваше определение enums преобразуется в следующий псевдо-код C #:

 public struct Color : System.Enum { public const int Red = 1; public const int Blue = 1; public const int Green = 1; } 

Вышеприведенный код не будет компилироваться в C #, потому что компилятор не позволяет определить структуру с явным базовым classом, но это то, что она испускает для определения enums.

Поскольку нет проблемы с типом, который содержит несколько констант, имеющих одинаковое значение, нет проблем с определением enums.

Но поскольку перечисление не имеет уникальных значений, у вас может возникнуть проблема при преобразовании в это перечисление. Например, следующие две строки кодов возвращают значение enums «Красный», поскольку первое значение выбирается произвольно.

 Color color1 = (Color)1; Color color2 = (Color)Enum.Parse(typeof(Color), "1"); 

Строго говоря, значение enums не красное, оно равно 1, но когда вы распечатываете значение, вы увидите красный цвет.

Кроме того, следующее логическое значение истинно, что выглядит немного странно …

 // true (Red is Green??) bool b = Color.Red == Color.Green; 

В нижней строке это совершенно законно, но вам решать использовать его, когда это имеет смысл …

Вот прямая ссылка на раздел моего учебника .NET, в котором обсуждаются enums под капотом: http://motti.me/c1E

Это совершенно законный C #. Из спецификации языка C # версии 4.0, раздел 14.3:

Множественные члены enums могут использовать одно и то же связанное значение. Пример

 enum Color { Red, Green, Blue, Max = Blue } 

показывает перечисление, в котором два члена enums – синий и Макс – имеют одинаковое значение.

Одно и то же числовое значение, но другое имя – не что иное, как псевдоним. Это может быть, например,

 public enum Color { DefaultColor = 1, Red = 1, Blue = 2 } 

Это может иметь смысл в некоторых случаях, но не так много. Когда вы проанализируете значения обратно и вызываете colorValue.ToString (), вы получите последнее значение в виде строкового значения назад (в этом случае красный), но вы потеряете встроенные цвета по умолчанию, так как это одно и то же. По крайней мере, так, как вы моделировали свои данные. Если вы хотите сохранить его раздельно, используйте разные значения для разных вещей.

Это было бы вполне приемлемым определением:

 public enum AllTheThings { TheMoney = 1, TheFreeRides = 1, TheLieThatYouDenied = 2, TheCallsYouveBeenMaking = 3, TheTimesYouveBeenFaking = 4 } 

Если вы думаете о каждом значении enums как константе, это имеет смысл. Нет причин, по которым вы не должны иметь две константы с одинаковым значением:

 public enum MyColor { Blue = 2, Yellow = 3, Green = 4 BlueAndYellow = 4, } 

Такой же как:

 public enum MyColor { Blue = 2, Yellow = 3, Green = 4, BlueAndYellow = Green, } 

По сути, у вас есть одна и та же константа с двумя разными именами. BlueAndYellow является псевдонимом для Green .

Здесь следует отметить, что не уникальные значения приводят к отсутствию и дублированию значений в дизайнере Visual Studio.

 public enum MyColor { Red= 1, Green= 1, Blue= 2 } 

если вы используете это перечисление в бросковом свойстве, вы увидите Green, Green, Blue в дизайнере, а не в Red, Green, Blue .

  • Структурировать объекты в Java
  • Что нужно переопределить в структуре, чтобы обеспечить правильное функционирование равенства?
  • Почему 16 байтов рекомендуемый размер для структуры в C #?
  • как назначить сразу несколько значений в структуру?
  • Структура структуры памяти C
  • Как правильно назначить новое строковое значение?
  • Являются ли C-структуры с теми же типами членов, которые имеют одинаковый макет в памяти?
  • myView.frame.origin.x = значение; не работает. Но почему?
  • Как работает встроенная реализация ValueType.GetHashCode?
  • C инициализировать массив внутри структуры
  • Есть ли способ перебрать структуру с элементами разных типов в C?
  • Interesting Posts

    CodeIgniter автоматически предотвращает SQL-инъекцию?

    Длина индекса varchar MySQL

    Как настроить mspaint на Windows Server 2008R2 / Win 7 для запуска с 1-пиксельным холстом или автоматической обрезкой вставленного изображения?

    Использование jQuery для захвата содержимого из iframe CKEditor

    Преобразование видео в формат, который, скорее всего, воспроизводится в системе Windows

    Самый быстрый способ заменить NA в большой таблице данных.

    Что такое std :: string :: c_str () lifetime?

    Разделить список на меньшие списки размера N

    HTTP-redirect: 301 (постоянный) против 302 (временный)

    Chrome не запускается в Windows 8, появляется сообщение об ошибке «Класс не зарегистрирован»,

    Перемещение всей линии вверх и вниз в Vim

    ошибка компоновщика при связывании учебника будильника буфера (неопределенные ссылки)

    Как выбрать элемент на основе состояния другого элемента на странице с помощью CSS?

    Как назначить статический IP-адрес моей машине VMWare?

    программный код textCursorDrawable

    Давайте будем гением компьютера.