Другое перечисление против int - PullRequest
1 голос
/ 08 ноября 2019

Мне нужны константы во всем пространстве имен. Поэтому у меня есть возможность использовать перечисления, например:

public enum Token
{
    INFORMATIONAL,
    WARNING,
    ABORT,
    FATAL
};

Но недостатком является, например, в WPF то, что мне нужно конвертировать их в int, время от времени.

Я подумал, почему бы не

public static class Token 
{
    public const int
    INFORMATIONAL = 0,
    WARNING =1,
    ABORT = 2,
    FATAL = 3;
};

в источнике, они выглядят одинаково И у меня нет проблем с конвертацией. Так в чем же причина перечислений? Я явно что-то упускаю. В чем причина перечислений?

Ответы [ 2 ]

4 голосов
/ 08 ноября 2019

Насколько мне известно, перечисления имеют только одно преимущество: Тип Безопасность.

Редактировать: У них также есть опция [Флаг], которая помогает кодировать множество настроек в одной переменной. Спасибо Джону за напоминание.

Есть эта интересная статья о Primitive Obession (и я действительно удивлен, как часто я связывал это, так как узнал об этом вчера).

Это относится к вашему случаю, например так: если вы просто используете Primtives везде, компилятор не сможет предупредить вас так сильно. Вы могли бы попытаться присвоить 42 переменной, которая была только предполагается одному из этих постоянных значений.

Но пытаться присвоить Enum что-либо, кроме допустимых значений? Довольно трудно / невозможно сделать случайно.

3 голосов
/ 08 ноября 2019

Замечание

С помощью enum вы определяете тип, у которого некоторые константы сами "типизированы" (не то слово, которое я не знаю, как это сказать).

Преимущество между использованием значений и констант enum заключается в возможности разбора значений и использования области действия enum в качестве типа.

Так что это лучшая абстракция.

Также вы невам не нужно заботиться об определении значений, даже если вы можете.

Например:

Анализ значений перечисления

foreach ( var value in Enum.GetValues(typeof(Token) ) ...

Передавая параметр перечисления

void Method(Token token) ...

Объявить коллекцию, набранную перечислением

var map = new Dictionary<Token, string>();

Проверка состояния

if ( value == Token.INFORMATIONAL ) ...

Простота использования битовых флагов

https://docs.microsoft.com/en-us/dotnet/api/system.flagsattribute

Имя элемента по умолчанию Результат ToString

Console.WriteLine(Token.INFORMATIONAL)

Будет отображаться имя значения, а не его значение, как для константы.

Таким образом, для отображения значения:

Console.WriteLine((int)Token.INFORMATIONAL)

Вывод

С константами нужноиспользуйте рефлексию для разбора списка, но он уродлив и вообще бесполезен, и вы не можете передать их как типизированный параметр.

Возможности использования констант ограничены.

Таким образом, перечисления и константы - это совсем не то же самое, даже базовое, что и использование int.

Таким образом, использование перечисления или констант зависит отиспользование, которое вы будете использовать.

Если вам нужны только значения int и вам не нужна сегрегация, выберите константы.

Если вы заботитесь о безопасности типов и вам нужны более сложные вещи, выберите enum.

Последнее слово, которое нужно сказать, это то, что enum не заботится о базовом значении, поэтому, если вам нужно работать со значениями, используйте константы, иначе enum.

Используйте то, что наиболеенатуральная вещь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...