Использование перечислений для представления именованных констант в C#
Представьте, что вы работаете над проектом для отслеживания состояния заказов, и вам нужно упорядочить такие значения, как "Ожидание", "Отправлено" или "Доставлено" четко и управляемо. Использование перечислений в C# позволяет создать список этих состояний заказа. Использование перечислений упрощает использование этих состояний в проекте без повторного создания или поиска.
Описание сценария перечисления и значения перечислений
Перечисления идеально подходят для представления набора предопределенных значений, которые являются взаимоисключающими или могут объединяться. Например, можно использовать перечисление для определения сезонов года:
enum Season
{
Spring,
Summer,
Autumn,
Winter
}
В примере кода показано, как определить перечисление для представления значений, исключающих друг друга.
Перечисления улучшают удобочитаемость кода, заменив числовые литералы значимыми именами. Они также помогают предотвратить назначение недопустимых значений, так как разрешены только определенные константы.
Примечание.
Перечисления также могут представлять сочетания вариантов выбора с помощью битовых флагов, которые полезны для сценариев, таких как разрешения файлов или параметры конфигурации.
Определение перечислений
Чтобы определить перечисление в C#, используйте enum ключевое слово, за которым следует имя перечисления и его членов. Ниже приведен пример простой перечисления на дни недели:
enum DaysOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
В примере кода показано, как определить перечисление для дней недели.
По умолчанию базовый тип перечисления — это значение, начинающееся intс 0, приращение к 1 для каждого элемента.
Примечание.
Перечисления ограничены целыми типами (например, int, byte, short) и не могут представлять нечисловые значения, такие как строки или десятичные значения.
Установка базовых типов и значений для перечислений
Можно указать другой базовый целочисленный тип перечисления и назначить пользовательские значения его членам. Рассмотрим пример.
enum ErrorCode : ushort
{
None = 0,
Unknown = 1,
ConnectionLost = 100,
OutlierReading = 200
}
В примере кода показано, как задать произвольный базовый тип и значения перечисления.
Эта гибкость позволяет выровнять значения перечисления с внешними системами или конкретными требованиями.
Подсказка
Избегайте использования не целочисленных типов, таких как char базовый тип перечисления, что может привести к ненадежному поведению.
Выполнение преобразований с перечислениями
Перечисления поддерживают явные преобразования между их членами и базовым целочисленным типом. Рассмотрим пример.
DaysOfWeek day = (DaysOfWeek)3;
Console.WriteLine(day); // Outputs: Wednesday
В этом примере кода показано, как выполнить явное преобразование целочисленного значения в перечисление.
Значения перечисления System.Enum.IsDefined можно проверить с помощью метода:
bool isValid = Enum.IsDefined(typeof(DaysOfWeek), 3);
Console.WriteLine(isValid); // Outputs: True
В примере кода показано, как проверить значение перечисления с помощью System.Enum.IsDefined.
Подсказка
Если значение недопустимо, его можно обрабатывать, назначив значение по умолчанию или создав исключение, чтобы обеспечить безопасное использование.
Применение рекомендаций по проектированию перечислений
Для эффективного проектирования перечислений:
- Используйте сингулярные существительные для простых перечислений и существительных множественного числа для перечисления флагов.
- Укажите значение нуля для простых перечислений, обычно именованных
None. - Избегайте использования специальных или зарезервированных значений, так как они могут запутать пользователей.
- Используйте два полномочия для перечисления флагов для включения побитовых операций.
Подсказка
Рассмотрите возможность добавления методов расширения в перечисления для получения дополнительных функциональных возможностей, таких как проверка или форматирование.
Реализация перечислений с пользовательскими значениями и методами
Хотя перечисления не могут содержать методы напрямую, можно добавить функциональные возможности с помощью методов расширения. Рассмотрим пример.
public static class DaysOfWeekExtensions
{
public static bool IsWeekend(this DaysOfWeek day)
{
return day == DaysOfWeek.Saturday || day == DaysOfWeek.Sunday;
}
}
DaysOfWeek today = DaysOfWeek.Saturday;
Console.WriteLine(today.IsWeekend()); // Outputs: True
В примере кода показано, как использовать метод расширения для добавления функциональных возможностей в перечисление.
Подсказка
Используйте методы расширения для улучшения перечислений без изменения их определения, что делает их более универсальными и многократно используемыми.
Практический пример. Использование перечислений для управления состояниями заказа
Перечисления часто используются в приложениях для представления предопределенных значений. Например, в приложении электронной коммерции можно использовать перечисление для управления состояниями заказов:
enum OrderStatus
{
Pending,
Shipped,
Delivered,
Cancelled
}
class Order
{
public int OrderId { get; set; }
public OrderStatus Status { get; set; }
public void UpdateStatus(OrderStatus newStatus)
{
Status = newStatus;
Console.WriteLine($"Order {OrderId} status updated to {Status}");
}
}
var order = new Order { OrderId = 123, Status = OrderStatus.Pending };
order.UpdateStatus(OrderStatus.Shipped);
В этом примере показано, как определить перечисление для состояний заказа, использовать его в классе и обновить состояние заказа. Это помогает новичкам увидеть, как перечисления могут применяться в реальном сценарии.
Используя перечисления, можно заменить числовые литералы значимыми именами, что упрощает и интуитивно понятный код, а также позволяет явным преобразованиям и проверкам обеспечить безопасное использование этих констант в проектах.