Замечание
С помощью 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.
Используйте то, что наиболеенатуральная вещь.