Переліки та константи. Яким використовувати коли?


95

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



див. також stackoverflow.com/questions/11575376/… щодо подібного питання для Java (відповіді в основному стосуються також C #).
Олексій Левенков

Відповіді:


95

Використовуйте перелічення, коли ви хочете визначити діапазон значень, якими може бути щось. Яскравим прикладом є колір:

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.

Інші моменти, на які слід звернути увагу:

  • a: Константи не обов’язково вказують на зв’язок між константами, тоді як перерахування вказує на те, що щось може бути одним із набору, визначеного переліком.
  • b: Визначений перелік може допомогти вам у перевірці типу, коли він використовується як аргумент. Константи - це просто значення, тому вони не надають ніякої додаткової семантичної інформації.

1
Що робити, якщо ви в кінцевому підсумку використовуєте .ToString()на enum багато, будь-яке значення у використанні класу з рядками const, який виглядає та діє як enum, але обходить виклик ToString()? Приклад
Сінджай

Зачекайте, здається, я відповів на власне запитання. Код у цьому прикладі не буде працювати: вам доведеться сприймати введення як рядок, який насправді не поводиться як перерахування.
Сінджай

1
Чому б ви не могли просто мати статичний клас Color з постійними кольорами, а не перерахувати? Яка різниця?
WDUK

в короткій заявіType Safety"
ahmednabil88,

30

В інших відповідях бракує того, що перелічення мають цілочисельний базовий тип. Ви можете змінити значення за замовчуванням з int на будь-який інший інтегральний тип, крім символу типу:

enum LongEnum : long {
    foo,
    bar,
}

Ви можете явно передати базовий тип і неявно до нього, що корисно в операторах switch. Пам'ятайте, що можна передати будь-яке значення базового типу в перелік, навіть якщо в переліку немає члена з відповідним значенням. Тому завжди використовувати розділ за замовчуванням у комутаторі - це гарна ідея. До речі, .NET сам дозволяє навіть перелічення з плаваючою комою, але ви не можете визначити їх у C #, хоча я думаю, що ви все одно можете їх використовувати (крім перемикача).

Крім того, використання перелічень забезпечує більшу безпеку типу. Якщо ви маєте намір використовувати, наприклад, константи int як параметри методу, тоді я міг би викликати метод із будь-яким значенням int. Звичайно, за допомогою кастингу це може статися і з переліками, але це станеться не випадково. Гірша можливість переплутати порядок параметрів.

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

Якщо константа A може переходити лише в a, а константа B може переходити в b, то використання двох різних типів перечислення виявить будь-яке неправильне використання під час компіляції.


20

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

Константи можуть бути будь-якого типу даних, але перелік - це перелік.

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

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


8

На додаток до відповіді Роберта:

  1. Використовуйте перелік для кінцевого набору іменованих значень. Вас насправді не цікавить числове значення кожного символу (але ви все одно можете накласти їх, наприклад, для сумісності із застарілою системою).

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


3

Константа AC # подібна до змінної тим, що вона надає визначеному імені значення. Однак константа відрізняється від стандартної змінної, оскільки після визначення значення, призначене константі, ніколи не може бути змінено. Головною перевагою констант є їх допомога у створенні коду, що самодокументовується, а також дозволяють декларування ключових значень в одному місці, що дозволяє легко підтримувати обслуговування, якщо значення потрібно оновити та перекомпілювати програмне забезпечення.

Тоді як списки Enumerator корисні для визначення послідовностей та станів, особливо коли існує природний прогрес через ці стани. Це пов’язано з тим, що кожну константу у списку можна відформатувати та порівняти, використовуючи її назву або значення. Перелік може також використовуватися для визначення обмеженого набору дійсних значень.


3

Одне, що мені здається зручним при використанні, enumзамість того const, що ви можете перебирати значення в enum, набагато важче це зробити зі constзначеннями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.