Выбрать главу

...

// Выводит строку "Contractor = 100".

Console.WriteLine("{0} = {1}", emp.ToString(), (byte)emp);

Console.ReadLine();

На заметку! Статический метод Enum.Format() предлагает более высокий уровень форматирования за счет указания флага желаемого формата. Полный список флагов форматирования ищите в документации.

В типе System.Enum определен еще один статический метод по имени GetValues(), возвращающий экземпляр класса System.Array. Каждый элемент в массиве соответствует члену в указанном перечислении. Рассмотрим следующий метод, который выводит на консоль пары "имя-значение" из перечисления, переданного в качестве параметра:

// Этот метод выводит детали любого перечисления.

static void EvaluateEnum(System.Enum e)

{

  Console.WriteLine("=> Information about {0}", e.GetType().Name);

  // Вывести лежащий в основе тип хранилища.

  Console.WriteLine("Underlying storage type: {0}",

                     Enum.GetUnderlyingType(e.GetType()));

  // Получить все пары "имя-значение" для входного параметра.

  Array enumData = Enum.GetValues(e.GetType());

  Console.WriteLine("This enum has {0} members.", enumData.Length);

  // Вывести строковое имя и ассоциированное значение,

  // используя флаг формата D (см. главу 3).

  for(int i = 0; i < enumData.Length; i++)

  {

  Console.WriteLine("Name: {0}, Value: {0:D}",

      enumData.GetValue(i));

  }

}

Чтобы протестировать метод EvaluateEnum(), модифицируйте код для создания переменных нескольких типов перечислений, объявленных в пространстве имен System (вместе с перечислением EmpTypeEnum):

Console.WriteLine("**** Fun with Enums *****");

...

EmpTypeEnum e2 = EmpType.Contractor;

// Эти типы являются перечислениями из пространства имен System.

DayOfWeek day = DayOfWeek.Monday;

ConsoleColor cc = ConsoleColor.Gray;

EvaluateEnum(e2);

EvaluateEnum(day);

EvaluateEnum(cc);

Console.ReadLine();

Ниже показана часть вывода:

=> Information about DayOfWeek

Underlying storage type: System.Int32

This enum has 7 members.

Name: Sunday, Value: 0

Name: Monday, Value: 1

Name: Tuesday, Value: 2

Name: Wednesday, Value: 3

Name: Thursday, Value: 4

Name: Friday, Value: 5

Name: Saturday, Value: 6

В ходе чтения книги вы увидите, что перечисления широко применяются во всех библиотеках базовых классов .NET Core. При работе с любым перечислением всегда помните о возможности взаимодействия с парами "имя-значение", используя члены класса System.Enum.

Использование перечислений, флагов и побитовых операций

Побитовые операции предлагают быстрый механизм для работы с двоичными числами на уровне битов. В табл. 4.3 представлены побитовые операции С#, описаны их действия и приведены примеры.

Чтобы взглянуть на побитовые операции в действии, создайте новый проект консольного приложения по имени FunWithBitwiseOperations. Поместите в файл Program.cs следующий код:

using System;

using FunWithBitwiseOperations;

Console.WriteLine("===== Fun wih Bitwise Operations");

Console.WriteLine("6 & 4 = {0} | {1}", 6 & 4, Convert.ToString((6 & 4),2));

Console.WriteLine("6 | 4 = {0} | {1}", 6 | 4, Convert.ToString((6 | 4),2));

Console.WriteLine("6 ^ 4 = {0} | {1}", 6 ^ 4, Convert.ToString((6 ^ 4),2));

Console.WriteLine("6 << 1  = {0} | {1}", 6 << 1, Convert.ToString((6 << 1),2));

Console.WriteLine("6 >> 1 = {0} | {1}", 6 >> 1, Convert.ToString((6 >> 1),2));

Console.WriteLine("~6 = {0} | {1}", ~6, Convert.ToString(~((short)6),2));

Console.WriteLine("Int.MaxValue {0}", Convert.ToString((int.MaxValue),2));

Console.readLine();

Ниже показан результат выполнения этого кода:

===== Fun wih Bitwise Operations

6 & 4 = 4 | 100

6 | 4 = 6 | 110

6 ^ 4 = 2 | 10

6 << 1  = 12 | 1100

6 >> 1 = 3 | 11

~6 =  -7 | 11111111111111111111111111111001

Int.MaxValue 1111111111111111111111111111111

Теперь, когда вам известны основы побитовых операций, самое время применить их к перечислениям. Добавьте в проект новый файл по имени ContactPreferenceEnum.cs и приведите его код к такому виду:

using System;

namespace FunWithBitwiseOperations

{

  [Flags]

  public enum ContactPreferenceEnum

  {

    None = 1,

 Email = 2,

    Phone = 4,

    Ponyexpress = 6

  }