1. Понятие перечислений:
C# Enum: тип enum — это базовый тип данных (тип значения), используемый для объявления набора именованных констант.
2. Определение перечислений:
Объявление переменной enum:
enum <enum_name> {enumeration list};
Здесь enum_name задаёт имя типа перечисления, а список перечисления — разделённый запятыми список идентификаторов.
Каждый элемент в списке перечисления представляет целочисленное значение, на единицу большее, чем элемент, предшествующий ему. По умолчанию первый элемент перечисления имеет значение 0. Например:
enum Days {Sun , Mon, tue, Fir, sat };
3. Элементы перечисления и использование переменных перечисления:
Пример
namespace EnumApplication
{
class EnumProgram
{
enum Days { Sun, Mon, tue, Wed, thu, Fri, sat };
static void Main(string[] args)
{
int WeekdayStart = (int)Days.Mon;
int WeekdayEnd = (int)Days.Fir;
Console.WriteLine("Monday:{0}",WeekdayStart);
Console.WriteLine("Firday:{0}",WeekdayEnd );
Console.ReadKey();
}
}
}
4. Класс Enum:
Все типы перечислений неявно наследуются от типа System.Enum. System.Enum — единственный ссылочный тип, производный от System.ValueType, который не является типом значения.

5. Класс Enum:
| Метод | Описание |
|---|---|
| CompareTo | Сравнивает этот экземпляр с указанным объектом и возвращает значение, указывающее на их относительные значения. |
| Equals: Указывает, равен ли этот экземпляр указанному объекту. | |
| Формат | Преобразует указанное значение указанного типа перечисления в эквивалентное строковое представление в соответствии с указанным форматом. |
| GetName | Извлекает имя константы, имеющей указанное значение в указанном перечислении. |
| GetNames | Извлекает массив имен констант в указанном перечислении. |
| GetTypeCode | Возвращает базовый TypeCode этого экземпляра. |
| GetUnderlyingTye | Возвращает базовый тип указанного перечисления. |
| GetValues | Массив значений констант в указанном enum. |
| HasFlag | Определяет, установлены ли в текущем экземпляре одно или несколько битовых полей. |
| IsDefined | Возвращает признак того, существует ли константа с указанным значением в указанном enum. |
| Parse | Преобразует строковое представление имени или числового значения одной или нескольких констант enum в эквивалентный объект enum; параметр указывает, выполняется ли операция без учета регистра. |
| TryParse | Преобразует строковое представление имени или числового значения одной или нескольких констант enum в эквивалентный объект enum; возвращаемое значение указывает, успешно ли выполнено преобразование. |
6. Флаговый enum / битовый enum
Флаговый enum в C# (Flags): тип enum — это базовый тип данных (тип значения), используемый для объявления набора именованных констант.
Значения enum взаимно исключают друг друга. Набор битовых флагов, однако, представляет собой список, образованный элементами, которые встречаются в комбинациях, обычно предназначенными для объединения новых значений с помощью операции "побитовое ИЛИ".
Тип enum обычно выражает семантически относительно независимый набор числовых значений. Использование типа enum для реализации набора битовых флагов — это самое идеальное сочетание, сокращённо называемое битовым перечислением.
7. Определение битового перечисления
///<summary>
/// 权限枚举
///</summary>
[Flags]
public enum permission 注意加了[Flags]特性后有三种写法,
{ 一种是使用<<符号,
Unknown = 0; // 也可以写成0x00或0 第二种是0x01,
还有一种是直接写0,1,2,4,8....,
Create = 1<<0, // 0x01或1 一般来说是2的n次方来表示。
注:<<左操作符,表示对这个数进行移位。
Read = 1<<1, //0x02或2
Update = 1<<2, //0x04或4
Delete = 1<<3 //0x08或8
}
8. Пример битового перечисления
//1、给用户创建、读取,修改和删除的权限 var parmission = Permission.Create | parmission.Read | parmission.Update | parmission.Delete; //2、去掉用户的修改和删除权限 parmission = parmission &~parmission.Update; parmission = parmission &~parmission.Delete; //3、给用户加上修改的权限 parmission = parmission | parmission.Update; //4、判断用户是否有创建的权限 var isCreate = (parmission & parmission.Create)!=0; //或者 var isCreate = (parmission & parmission.Create)==parmission.Create; 这时parmission枚举的值将变成0+1+4=5,它的ToSting()将变成“parmission.Create, parmission.Read”,parmission.Update; 这里我们可以解释为什么第五个值Delete是8而不能成为5. 也就是说它的值不应该是前几项值的复合值。一个比较简单的方法 就是用2的n次方来依次位每一项赋值,例如:1,2,4,8,16,32,64.......。
Исходный адрес: https://www.cnblogs.com/chenyao-1424433719/p/11213658.html