1. Понятие перечислений:

C# Enum: тип enum — это базовый тип данных (тип значения), используемый для объявления набора именованных констант.

2. Определение перечислений:

Объявление переменной enum:

enum <enum_name> {enumeration list};

Здесь enum_name задаёт имя типа перечисления, а список перечисления — разделённый запятыми список идентификаторов.

Каждый элемент в списке перечисления представляет целочисленное значение, на единицу большее, чем элемент, предшествующий ему. По умолчанию первый элемент перечисления имеет значение 0. Например:

 
enum Days {Sun , Mon, tue, Fir, sat };

3. Элементы перечисления и использование переменных перечисления:

Пример

using System;
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