Типы перечислений (Руководство по программированию в C#)
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; enum Months : byte { Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec };
Вы можете проверить основные числовые значения путем приведения в базовый тип, как показано в следующем примере.
Days today = Days.Monday; int dayNumber =(int)today; Console.WriteLine("{0} is day number #{1}.", today, dayNumber); Months thisMonth = Months.Dec; byte monthNumber = (byte)thisMonth; Console.WriteLine("{0} is month number #{1}.", thisMonth, monthNumber); // Output: // Monday is day number #1. // Dec is month number #11.
Далее указаны преимущества использования enum вместо числового типа.
-
Для клиентского кода ясно задается, какие значения допустимы для переменной.
-
В Visual Studio в списке IntelliSense перечисляются определенные значения.
Если переменная meetingDay имеет тип Days, ей можно (без явного приведения) присвоить только одно из значений, определенных в Days. И если день встречи изменяется, можно назначить новое значение из Days переменной meetingDay:
Days meetingDay = Days.Monday;
//...
meetingDay = Days.Friday;
Примечание |
---|
Переменной meetingDay можно присвоить любое произвольное целое значение. Например, эта строка кода не генерирует ошибку: meetingDay = (Days) 42. Но этого делать нельзя, поскольку неявно ожидается, что переменная перечисления принимает одно из значений, определяемых перечислением. Присвоение переменной типа перечисления произвольного значения связано с большим риском возникновения ошибок. |
Элементам списка перечислителя типа перечисления можно присвоить любые значения, и можно также использовать вычисленные значения:
enum MachineState
{
PowerOff = 0,
Running = 5,
Sleeping = 10,
Hibernating = Sleeping + 5
}
Типы перечислений как битовые флаги
[Flags] enum Days2 { None = 0x0, Sunday = 0x1, Monday = 0x2, Tuesday = 0x4, Wednesday = 0x8, Thursday = 0x10, Friday = 0x20, Saturday = 0x40 } class MyClass { Days2 meetingDays = Days2.Tuesday | Days2.Thursday; }
Чтобы установить флаг на перечислении, используйте побитовый оператор OR, как показано в следующем примере.
// Initialize with two flags using bitwise OR. meetingDays = Days2.Tuesday | Days2.Thursday; // Set an additional flag using bitwise OR. meetingDays = meetingDays | Days2.Friday; Console.WriteLine("Meeting days are {0}", meetingDays); // Output: Meeting days are Tuesday, Thursday, Friday // Remove a flag using bitwise XOR. meetingDays = meetingDays ^ Days2.Tuesday; Console.WriteLine("Meeting days are {0}", meetingDays); // Output: Meeting days are Thursday, Friday
Чтобы определить, установлен ли конкретный флаг, используйте побитовый оператор AND, как показано в следующем примере.
// Test value of flags using bitwise AND. bool test = (meetingDays & Days2.Thursday) == Days2.Thursday; Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not"); // Output: Thursday is a meeting day.
Дополнительные сведения о том, что необходимо учитывать при определении типов перечислений при помощи атрибутаFlagsAttribute, см. в разделе Enum.
Использование методов System.Enum для получения и обработки значений перечислений
string s = Enum.GetName(typeof(Days), 4); Console.WriteLine(s); Console.WriteLine("The values of the Days Enum are:"); foreach (int i in Enum.GetValues(typeof(Days))) Console.WriteLine(i); Console.WriteLine("The names of the Days Enum are:"); foreach (string str in Enum.GetNames(typeof(Days))) Console.WriteLine(str);
Дополнительные сведения см. в разделе [AllMembers.T:System.Enum].