Почему я предпочитаю перечисление структуры с постоянными значениями
Структура с константами:
public struct UserType
{
public const int Admin=1;
public const int Browser=2;
public const int Operator=3;
}
И теперь позвольте использовать перечисление для этой же цели:
public enum UserType
{
Admin=1,
Browser,
Operator
}
Оба выделены в стеке. В обоих случаях я скажу UserType.Admin. И со структурным способом мне не придется бросать в int, чтобы получить базовое значение. Я знаю, что с версией enum он гарантирует, что будет использоваться одно и только одно из трех значений, тогда как в случае с конструктивной версией любое целое число может быть, что означает любое значение между Int32.MinValue и Int32.MaxValue. Есть ли другое преимущество, предпочитающее перечисления помимо этого?
Ответы
Ответ 1
Есть ли другое преимущество предпочтительного перечисления помимо этого?
Clarity.
Предположим, что у вас есть поле или параметр метода, который всегда будет иметь одно из этих трех значений. Если вы создадите тип перечисления, то:
- Вы не можете случайно присвоить ему какое-то произвольное целочисленное значение. (Вы можете преднамеренно применить любое значение
int
к типу перечисления, но вам нужно сделать это явно.)
- Это ясно, какая информация предназначена для представления
Это невероятно важные преимущества при написании кода, который легко поддерживать в будущем. Чем больше вы можете сделать свой код естественным образом описывающим то, что вы пытаетесь достичь, тем лучше.
Ответ 2
Перечисления можно искать из строк или чисел без отражения, например
// VERY important when using ORMs, as databases usually use an int
UserType ut = (UserType)2;
// Useful when parsing config files like appSettings.
UserType utf = (UserType)Enum.Parse(typeof(UserType),"Admin");
В рамках гораздо больше возможностей для ускорения общих операций с Enums. Другое дело - FlagsAttribute для битполей, что невозможно с помощью const ints.
Проверьте члены класса Enum для получения дополнительных вспомогательных функций, например. GetNames и GetValues.
Ответ 3
Это две разные вещи.
Каждый тип перечисления имеет базовый тип, который может быть любым целым типом, кроме char. Перечисления представляют собой целые типы, которые делают код более понятным и понятным.
A struct может содержать поля, методы, константы, конструкторы, свойства, индексы, операторы и даже другие типы структуры. Структуры аналогичны кланам, но предназначены для совместной группировки подобных элементов данных.