Перечисления и константы. Что использовать, когда?

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

Ответ 1

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

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.

Ответ 2

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

enum LongEnum : long {
    foo,
    bar,
}

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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