Looking for .net Keywords? Try Ask4Keywords

.NET Framework Определение Enum


пример

Перечисление - это особый тип класса. Ключевое слово enum сообщает компилятору, что этот класс наследуется от абстрактного класса System.Enum. Перечисления используются для отдельных списков элементов.

public enum MyEnum
{
    Monday = 1,
    Tuesday,
    Wednesday,
    //...
}

Вы можете представить себе перечисление как удобный способ сопоставления констант с некоторым базовым значением. Перечисленное выше, объявляет значения для каждого дня недели и начинается с 1 . Tuesday автоматически будет отображаться на 2 , в Wednesday до 3 и т. Д.

По умолчанию перечисления используют int как базовый тип и начинаются с 0, но вы можете использовать любой из следующих интегральных типов : byte, sbyte, short, ushort, int, uint, long, or ulong и можете указывать явные значения для любого вещь. Если некоторые элементы явно указаны, но некоторые из них не указаны, каждый элемент после последнего определенного будет увеличен на 1.

Мы хотели бы использовать этот пример литья другого значения для MyEnum как так:

MyEnum instance = (MyEnum)3; // the variable named 'instance' gets a 
                             //value of MyEnum.Wednesday, which maps to 3.

int x = 2;
instance = (MyEnum)x; // now 'instance' has a value of MyEnum.Tuesday

Другой полезный, хотя и более сложный тип перечисления называется Flags . При украшении перечисления с на Flags атрибутов, вы можете присвоить переменное более одного значения в то время. Обратите внимание: при этом вы должны явно определять значения в представлении базы 2.

[Flags]
public enum MyEnum
{
    Monday = 1,
    Tuesday = 2,
    Wednesday = 4,
    Thursday = 8,
    Friday = 16,
    Saturday = 32, 
    Sunday = 64
}

Теперь вы можете сравнивать более одного значения за раз, используя побитовое сравнение или, если вы используете .NET 4.0 или новее, встроенный метод Enum.HasFlag .

MyEnum instance = MyEnum.Monday | MyEnum.Thursday; // instance now has a value of
                                                   // *both* Monday and Thursday,
                                                   // represented by (in binary) 0100. 

if (instance.HasFlag(MyEnum.Wednesday))
{
    // it doesn't, so this block is skipped
}
else if (instance.HasFlag(MyEnum.Thursday))
{
    // it does, so this block is executed
}

Поскольку класс Enum подклассифицирован из System.ValueType , он рассматривается как тип значения и передается по значению, а не по ссылке. Базовый объект создается в куче, но когда вы передаете значение перечисления в вызов функции, копия значения, использующего базовый тип значения Enum (обычно System.Int32), помещается в стек. Компилятор отслеживает связь между этим значением и базовым объектом, который был создан в стеке. Дополнительную информацию см. В разделе ValueType Class (System) (MSDN) .