static int Add(ref int x) { /* */ }

static int Add(int x) { /* */ }

На этом начальное изучение построения методов с использованием синтаксиса C# завершено. Теперь давайте выясним, как строить перечисления и структуры и манипулировать ими.

<p id="AutBody_Root166">Понятие типа enum</p>

Вспомните из главы 1, что система типов .NET Core состоит из классов, структур, перечислений, интерфейсов и делегатов. Чтобы начать исследование таких типов, рассмотрим роль перечисления (епшп), создав новый проект консольного приложения по имени FunWithEnums.

На заметку! Не путайте термины перечисление и перечислитель; они обозначают совершенно разные концепции. Перечисление — специальный тип данных, состоящих из пар "имя-значение". Перечислитель — тип класса или структуры, который реализует интерфейс .NET Core по имени IEnumerable. Обычно упомянутый интерфейс реализуется классами коллекций, а также классом System.Array. Как будет показано в главе 8, поддерживающие IEnumerable объекты могут работать с циклами foreach.

При построении какой-либо системы часто удобно создавать набор символических имен, которые отображаются на известные числовые значения. Например, в случае создания системы начисления заработной платы может возникнуть необходимость в ссылке на типы сотрудников с применением констант вроде VicePresident (вице-президент), Manager (менеджер), Contractor (подрядчик) и Grunt (рядовой сотрудник). Для этой цели в C# поддерживается понятие специальных перечислений. Например, далее представлено специальное перечисление по имени EmpTypeEnum (его можно определить в том же файле, где находятся операторы верхнего уровня, если определение будет помещено в конец файла):

using System;

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

Console.ReadLine();

// Здесь должны находиться локальные функции:

// Специальное перечисление.

enum EmpTypeEnum

{

  Manager,      // = 0

  Grunt,        // = 1

  Contractor,   // = 2

  VicePresident // = 3

}

На заметку! По соглашению имена типов перечислений обычно снабжаются суффиксом Enum. Поступать так необязательно, но подобный подход улучшает читабельность кода.

В перечислении EmpTypeEnum определены четыре именованные константы, которые соответствуют дискретным числовым значениям. По умолчанию первому элементу присваивается значение 0, а остальным элементам значения устанавливаются по схеме n+1. При желании исходное значение можно изменять подходящим образом. Например, если имеет смысл нумеровать члены EmpTypeEnum со значения 102 до 105, тогда можно поступить следующим образом:

// Начать нумерацию со значения 102.

enum EmpTypeEnum

{

  Manager = 102,

  Grunt,        // = 103

  Contractor,   // = 104

  VicePresident // = 105

}

Нумерация в перечислениях не обязана быть последовательной и содержать только уникальные значения. Если (по той или иной причине) перечисление EmpTypeEnum необходимо сконфигурировать так, как показано ниже, то компиляция пройдет гладко и без ошибок:

// Значения элементов в перечислении не обязательно должны

// быть последовательными!

enum EmpType

{

  Manager = 10,

  Grunt = 1,

  Contractor = 100,

  VicePresident = 9

}

<p id="AutBody_Root167">Управление хранилищем, лежащим в основе перечисления</p>

По умолчанию для хранения значений перечисления используется тип System.Int32 (int в языке С#); тем не менее, при желании его легко заменить. Перечисления в C# можно определять в похожей манере для любых основных системных типов (byte, short, int или long). Например, чтобы значения перечисления EmpTypeEnum хранились с применением типа byte, а не int, можно записать так:

// На этот раз для элементов EmpTypeEnum используется тип byte.

enum EmpTypeEnum : byte

{

  Manager = 10,

  Grunt = 1,

  Contractor = 100,

  VicePresident = 9

}

Перейти на страницу:

Похожие книги