Перечисления и константы. Что использовать, когда? - PullRequest
84 голосов
/ 05 марта 2009

Я читал перечисления и нашел их очень похожими на объявление констант. Как бы я знал, когда использовать константу, а не перечисление или наоборот. Каковы некоторые преимущества использования перечислений?

Ответы [ 6 ]

81 голосов
/ 05 марта 2009

Используйте перечисления, когда вы хотите определить диапазон значений, который может быть чем-то. Цвет является очевидным примером, как:

public enum Colour
{
    White,
    Red,
    Blue
}

Или, возможно, набор возможных вещей, таких как: (Пример, который я украл у здесь , потому что я ленивый)

[FlagsAttribute]
enum DistributedChannel
{
  None = 0,
  Transacted = 1,
  Queued = 2,
  Encrypted = 4,
  Persisted = 16,
  FaultTolerant = Transacted | Queued | Persisted
}

Константы должны быть для одного значения, как PI. Нет диапазона значений PI, есть только PI.

27 голосов
/ 05 марта 2009

Чего не хватает в других ответах, так это того, что перечисления имеют целочисленный базовый тип. Вы можете изменить значение по умолчанию с int на любой другой целочисленный тип, кроме char, например:

enum LongEnum : long {
    foo,
    bar,
}

Вы можете явно и неявно приводить к базовому типу, что полезно в операторах переключения. Помните, что в перечисление можно привести любое значение базового типа, даже если перечисление не имеет члена с соответствующим значением. Поэтому всегда рекомендуется использовать секцию по умолчанию в коммутаторе. Кстати, сама .NET допускает даже перечисления с плавающей запятой, но вы не можете определить их в C #, хотя я думаю, что вы все равно можете их использовать (кроме как в switch).

Кроме того, использование перечислений дает вам больше безопасности типов. Если вы собираетесь использовать, например, константы int как параметры метода, тогда я мог бы вызвать метод с любым значением int. Конечно, через приведение типов это может произойти и с перечислениями, но это не произойдет случайно. Хуже возможность запутать порядок параметров.

void method(int a, int b) {...}

Если только константа A может входить в a, а константа B может входить только в b, то использование двух различных типов перечислений позволит обнаружить любое неправильное использование во время компиляции.

19 голосов
/ 05 марта 2009

Константа - это языковая функция, которая говорит, что переменная не изменит значения (поэтому компилятор может оптимизировать эти знания), где перечисление имеет определенный тип.

Константы могут быть любого типа данных, но перечисление является перечислением.

Я использую enum в любом месте, где у вас может быть несколько опций, и я хочу улучшить читаемость кода. то есть вы можете иметь уровни трассировки как int со значениями 0, 1, 2 или как перечисление как error, warning и info.

Enum также может использоваться как побитовые операторы, то есть FontStyle.Bold | FontStyle.Italic даст вам жирный и курсивный шрифт.

8 голосов
/ 05 марта 2009

В дополнение к ответу Роберта:

  1. Используйте enum для конечного набора именованных значений. Вы на самом деле не заботитесь о числовом значении каждого символа (но у вас все еще есть возможность наложить их, например, для совместимости с устаревшей системой).

  2. Роберт: Да, Enum можно использовать как битовые поля. Используйте атрибут Flags (и убедитесь, что члены перечисления имеют подходящие числовые значения).

3 голосов
/ 05 марта 2009

Константа C # похожа на переменную тем, что она дает определенное имя значению. Однако константа отличается от стандартной переменной, поскольку после ее определения значение, присвоенное этой константе, никогда не может быть изменено. Основным преимуществом констант является их помощь в создании самодокументируемого кода, а также возможность объявления значений ключей в одном месте, что упрощает обслуживание в случае необходимости обновления значения и перекомпиляции программного обеспечения.

Принимая во внимание, что списки перечислителя полезны для определения последовательностей и состояний, особенно когда есть естественное прохождение через эти состояния. Это связано с тем, что каждая константа в списке может быть отформатирована и сравнена с использованием либо ее имени, либо значения. Перечисление также может использоваться для определения ограниченного набора допустимых значений.

1 голос
/ 05 апреля 2019

При использовании enum вместо const мне особенно удобно то, что вы можете перебирать значения в enum, это гораздо сложнее сделать с const значениями.

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