0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#Руководства</a></p>
1
<p><a>#Руководства</a></p>
2
<ul><li>26 авг 2020</li>
2
<ul><li>26 авг 2020</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>В C# есть много крутых инструментов, которые позволяют улучшить любой код. Один из них - enum. Давайте разберёмся, что это и как с ним работать.</p>
4
</ul><p>В C# есть много крутых инструментов, которые позволяют улучшить любой код. Один из них - enum. Давайте разберёмся, что это и как с ним работать.</p>
5
<p> vlada_maestro / shutterstock</p>
5
<p> vlada_maestro / shutterstock</p>
6
<p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
6
<p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7
<p>Списки перечисления (или<em>enum</em>) сокращают код и улучшают его читаемость. В этой статье мы создадим enum и научимся применять его эффективно.</p>
7
<p>Списки перечисления (или<em>enum</em>) сокращают код и улучшают его читаемость. В этой статье мы создадим enum и научимся применять его эффективно.</p>
8
<p>Это список однотипных значений: цветов, состояний, способов выравнивания и так далее. Например, в C# существует встроенный список цветов:</p>
8
<p>Это список однотипных значений: цветов, состояний, способов выравнивания и так далее. Например, в C# существует встроенный список цветов:</p>
9
//Эта надпись будет белого цвета Console.WriteLine("Hello, World!"); //Указываем для текста синий цвет из списка ConsoleColor Console.ForegroundColor = ConsoleColor.Blue; //При конвертации в строку выводится идентификатор цвета Console.WriteLine($"Color changed to {Console.ForegroundColor}"); //При конвертации в число - значение Console.WriteLine($"Color code: {(int)Console.ForegroundColor}");<p>То есть нам не нужно вручную вводить код цвета - вместо этого мы просто выбираем значение из заранее составленного списка.</p>
9
//Эта надпись будет белого цвета Console.WriteLine("Hello, World!"); //Указываем для текста синий цвет из списка ConsoleColor Console.ForegroundColor = ConsoleColor.Blue; //При конвертации в строку выводится идентификатор цвета Console.WriteLine($"Color changed to {Console.ForegroundColor}"); //При конвертации в число - значение Console.WriteLine($"Color code: {(int)Console.ForegroundColor}");<p>То есть нам не нужно вручную вводить код цвета - вместо этого мы просто выбираем значение из заранее составленного списка.</p>
10
<a></a><p>В самом<em>enum</em>тоже не хранится код цвета. Цифра 9 на примере выше - это индекс элемента в списке. Логика изменения цвета в нашем случае примерно такая:</p>
10
<a></a><p>В самом<em>enum</em>тоже не хранится код цвета. Цифра 9 на примере выше - это индекс элемента в списке. Логика изменения цвета в нашем случае примерно такая:</p>
11
//Программа проверяет, какой цвет выбран if(ForegroundColor == ConsoleColor.Blue) { //Далее программа определяет RGB-код синего цвета color = new Color(0, 0, 255); } //Вывод переданного текста в новом цвете WriteLine(text, color);<p>Создайте отдельный файл и назовите его так, чтобы понять, какой это список. Например,<em>Direction.cs:</em></p>
11
//Программа проверяет, какой цвет выбран if(ForegroundColor == ConsoleColor.Blue) { //Далее программа определяет RGB-код синего цвета color = new Color(0, 0, 255); } //Вывод переданного текста в новом цвете WriteLine(text, color);<p>Создайте отдельный файл и назовите его так, чтобы понять, какой это список. Например,<em>Direction.cs:</em></p>
12
public enum Direction { North, //0 South, //1 East, //2 West, //3 None //4 }<p>После объявления нового<em>enum</em>он используется как тип данных:</p>
12
public enum Direction { North, //0 South, //1 East, //2 West, //3 None //4 }<p>После объявления нового<em>enum</em>он используется как тип данных:</p>
13
Direction d = Direction.North;<p>Вы можете указать и какие-то собственные значения для элементов. Например, коды ответа веб-сервера:</p>
13
Direction d = Direction.North;<p>Вы можете указать и какие-то собственные значения для элементов. Например, коды ответа веб-сервера:</p>
14
public enum Response { OK = 200, Forbidden = 403, NotFound = 404, InternalServerError = 500, BadGateway = 502 }<p>По умолчанию тип значения -<em>int</em>, но он изменяется на любой другой целочисленный тип:</p>
14
public enum Response { OK = 200, Forbidden = 403, NotFound = 404, InternalServerError = 500, BadGateway = 502 }<p>По умолчанию тип значения -<em>int</em>, но он изменяется на любой другой целочисленный тип:</p>
15
public enum Days : byte { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }<p>Самый простой пример - конструкции<em>if</em>и <em>switch</em>.</p>
15
public enum Days : byte { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }<p>Самый простой пример - конструкции<em>if</em>и <em>switch</em>.</p>
16
int y = 0; int x = 0; while(true) { Console.Clear(); Console.WriteLine($"Your position: [{x} , {y}]"); Console.WriteLine("Choose direction: "); //Выводим все значения из Direction foreach(Direction d in Enum.GetValues(typeof(Direction))) { Console.WriteLine($"{(int)d} - {d}"); } int c = Convert.ToInt32(Console.ReadLine()); //Такая проверка намного проще читается, чем если бы использовались просто числа switch((Direction)c) { case Direction.North: y++; break; case Direction.South: y--; break; case Direction.East: x++; break; case Direction.West: x--; break; } }<p>Вот результат работы такой программы:</p>
16
int y = 0; int x = 0; while(true) { Console.Clear(); Console.WriteLine($"Your position: [{x} , {y}]"); Console.WriteLine("Choose direction: "); //Выводим все значения из Direction foreach(Direction d in Enum.GetValues(typeof(Direction))) { Console.WriteLine($"{(int)d} - {d}"); } int c = Convert.ToInt32(Console.ReadLine()); //Такая проверка намного проще читается, чем если бы использовались просто числа switch((Direction)c) { case Direction.North: y++; break; case Direction.South: y--; break; case Direction.East: x++; break; case Direction.West: x--; break; } }<p>Вот результат работы такой программы:</p>
17
<p>Также вы можете использовать<em>enum</em>вместе с <a>полиморфизмом</a>.</p>
17
<p>Также вы можете использовать<em>enum</em>вместе с <a>полиморфизмом</a>.</p>
18
//Легко читается без каких-либо комментариев item.Set(ItemType.Food); item.Set(ItemState.InInventory); //Длинные названия методов, непонятные аргументы item.SetType(false, false, true); item.SetState(false, true, false); //Использование аксессоров упрощает изменение значений, но не решает проблему с непонятными аргументами в конструкторе item.IsFood = true; item.IsInInventory = true;<p>Таким образом вы получите код, который очень быстро читается. И теперь не нужно думать, какой метод использовать, - благодаря полиморфизму всё выглядит почти как человеческая речь:<em>set item type - Food</em>(указать тип предмета - Еда).</p>
18
//Легко читается без каких-либо комментариев item.Set(ItemType.Food); item.Set(ItemState.InInventory); //Длинные названия методов, непонятные аргументы item.SetType(false, false, true); item.SetState(false, true, false); //Использование аксессоров упрощает изменение значений, но не решает проблему с непонятными аргументами в конструкторе item.IsFood = true; item.IsInInventory = true;<p>Таким образом вы получите код, который очень быстро читается. И теперь не нужно думать, какой метод использовать, - благодаря полиморфизму всё выглядит почти как человеческая речь:<em>set item type - Food</em>(указать тип предмета - Еда).</p>
19
<p>Другая хорошая практика - использовать<em>enum</em>в качестве возвращаемого типа для методов, в которых ошибка может произойти по разным причинам. Например, отправка данных на сервер.</p>
19
<p>Другая хорошая практика - использовать<em>enum</em>в качестве возвращаемого типа для методов, в которых ошибка может произойти по разным причинам. Например, отправка данных на сервер.</p>
20
public Response Send(string data) { if(string.IsNullOrEmpty(data)) { return Response.EmptyData; } else if(trySend(data)) { return Response.Success; } else { return Response.Error; } }<p>Этот метод возвращает три сообщения в зависимости от ситуации:</p>
20
public Response Send(string data) { if(string.IsNullOrEmpty(data)) { return Response.EmptyData; } else if(trySend(data)) { return Response.Success; } else { return Response.Error; } }<p>Этот метод возвращает три сообщения в зависимости от ситуации:</p>
21
<ul><li>Попытка отправить пустой запрос.</li>
21
<ul><li>Попытка отправить пустой запрос.</li>
22
<li>Успешная отправка запроса.</li>
22
<li>Успешная отправка запроса.</li>
23
<li>Неизвестная ошибка.</li>
23
<li>Неизвестная ошибка.</li>
24
</ul><p>Конечно, допустимо куда больше вариантов: от ошибки базы данных до превышения времени ожидания.</p>
24
</ul><p>Конечно, допустимо куда больше вариантов: от ошибки базы данных до превышения времени ожидания.</p>
25
<p>Представим, что у нас есть класс<em>Item</em>со следующими полями:</p>
25
<p>Представим, что у нас есть класс<em>Item</em>со следующими полями:</p>
26
<ul><li>id - идентификатор;</li>
26
<ul><li>id - идентификатор;</li>
27
<li>name - название;</li>
27
<li>name - название;</li>
28
<li>isWeapon - булево значение, которое говорит, является ли предмет оружием.</li>
28
<li>isWeapon - булево значение, которое говорит, является ли предмет оружием.</li>
29
</ul><p>Все эти значения передаются объекту через конструктор, поэтому инициализация выглядит так:</p>
29
</ul><p>Все эти значения передаются объекту через конструктор, поэтому инициализация выглядит так:</p>
30
Item item = new Item(1, "Sword", true);<p>Без<em>enum</em>со временем вы забудете, за что отвечает третий аргумент, и вам придётся каждый раз проверять реализацию класса, чтобы освежить память. Или вы добавите новые типы предметов, из-за чего таких аргументов (<strong>isArmor</strong>,<strong>isPotion</strong>) станет ещё больше:</p>
30
Item item = new Item(1, "Sword", true);<p>Без<em>enum</em>со временем вы забудете, за что отвечает третий аргумент, и вам придётся каждый раз проверять реализацию класса, чтобы освежить память. Или вы добавите новые типы предметов, из-за чего таких аргументов (<strong>isArmor</strong>,<strong>isPotion</strong>) станет ещё больше:</p>
31
Item item = new Item(1, "Potion", false, false, true);<p>Избежать таких неприятных моментов как раз и помогает<em>enum</em>: создайте перечисление ItemType и передавайте в конструктор его.</p>
31
Item item = new Item(1, "Potion", false, false, true);<p>Избежать таких неприятных моментов как раз и помогает<em>enum</em>: создайте перечисление ItemType и передавайте в конструктор его.</p>
32
Item item = new Item(1, "Potion", ItemType.Potion);<p>С первого взгляда понятно, что здесь имеется в виду.</p>
32
Item item = new Item(1, "Potion", ItemType.Potion);<p>С первого взгляда понятно, что здесь имеется в виду.</p>
33
<p>C# - это мощный и красивый язык, который даёт разработчикам большие возможности, позволяя писать почти человеческим языком. Списки перечислений - лишь одна из таких вещей. Ещё есть лямбда-функции, делегаты, ООП и многое другое.</p>
33
<p>C# - это мощный и красивый язык, который даёт разработчикам большие возможности, позволяя писать почти человеческим языком. Списки перечислений - лишь одна из таких вещей. Ещё есть лямбда-функции, делегаты, ООП и многое другое.</p>
34
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
34
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>