Перечисления (enum
) представляют собой объединение в одной сущности сходных по смыслу целочисленных констант.
Например, мы могли бы держать в программе несколько констант для обозначения версии операционной системы на которой запущена наша программа:
const int WIN7 = 0; const int WIN10 = 1;
Вместо этого удобней использовать перечисление. Перечисления в общем виде объявляются следующим образом:
enum имя_перечисления { символьное_имя_1 [= числовое_значение_1], символьное_имя_2 [= числовое_значение_2], ... }
Явное присваивание элементам перечисления числовых значений (т.е. все что в квадратных скобках) можно опускать. При этом элементам перечисления автоматически присваиваются значения начиная с нуля, и увеличиваются на единицу.
Для представления доступных операционных систем мы могли бы использовать следующее перечисление:
public enum OSType { Win7, Win10 }
Создание экземпляра перечисления
Перечисления в C# относятся к значимым типам, таким образом создание экземпляра перечисления возможно без использования ключевого слова new()
, путем прямого присваивания значения переменной перечисления:
public enum OSType { Win7, Win10 } static void Main() { OSType ostype = OSType.Win7; Console.WriteLine(ostype); }
Получение количества элементов перечисления и перебор элементов перечисления.
Базовым классом для всех перечислений является System.Enum
. Класс Enum
содержит статический метод GetNames
, который позволяет получить перечень имен элементов перечисления. Метод GetNames
возвращает массив типа string[]
, содержащий имена элементов перечисления.
Пример использования метода Enum.GetNames()
:
public enum OSType { Win7, Win10 } static void Main() { foreach (string ostypeName in Enum.GetNames(typeof(OSType))) Console.WriteLine(ostypeName); } // Вывод: // Win7 // Win10
Еще один статический метод класса Enum
– GetValues
– позволяет получить перечень числовых значений элементов перечисления.
Пример использования метода Enum.GetValues()
:
public enum OSType { Win7, Win10 } static void Main() { foreach (int ostypeValue in Enum.GetValues(typeof(OSType))) Console.WriteLine(ostypeValue); } // Вывод: // 0 // 1
Общее количество элементов перечисления можно получить используя любой из методов класса Enum
– GetNames
или GetValues
при помощи метода Array.Length
:
public enum OSType { Win7, Win10 } static void Main() { int ostypeElementsCount; // Получаем количество элементов в перечислении OSType ostypeElementsCount = Enum.GetValues(typeof(OSType)).Length; Console.WriteLine(ostypeElementsCount); } // Вывод: // 2
Представление перечислений в символьном виде (enum.ToFriendlyString).
Один из способов представления перечислений в нормальном текстовом виде – создание метода расширения:
public enum OSType { Win7, Win10 } public static class OSTypeExtensions { public static string ToFriendlyString(this OSType osType) { switch (osType) { case OSType.Win7: return "Windows 7"; case OSType.Win10: return "Windows 10"; default: return string.Empty; } } } class Program { static void Main() { OSType ostype = OSType.Win10; // Следующая строка выведет: Windows 10 Console.WriteLine(ostype.ToFriendlyString()); } }
Представление перечислений в символьном виде с помощью Description
Более универсальный метод с использованием атрибута Description
из пространства имен System.ComponentModel
был предложен на сайте StackOverflow:
public static string GetDescription<T>(this T enumerationValue) where T : struct { Type type = enumerationValue.GetType(); if (!type.IsEnum) { throw new ArgumentException("EnumerationValue must be of Enum type", "enumerationValue"); } MemberInfo[] memberInfo = type.GetMember(enumerationValue.ToString()); if (memberInfo != null && memberInfo.Length > 0) { object[] attrs = memberInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); if (attrs != null && attrs.Length > 0) { return ((DescriptionAttribute)attrs[0]).Description; } } return enumerationValue.ToString(); }