HTML Diff
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>