Изменение перечисления чревато, но может быть сделано в ограниченной степени. Рассмотрим:
public enum SomeColors
{
Black,
blue,
red
}
Код в другой сборке, скомпилированной для использования SomeColors.blue
, сломается, если мы сделаем:
public enum SomeColors
{
Black,
Green,
blue,
red
}
Поскольку в нем будет скомпилировано значение 1
, которое теперь является значением SomeColors.Green
, тогда как SomeColors.blue
теперь 2
.
Кроме того, если бы мы изменили первый, чтобы иметь одинаковую заглавную букву, на:
public enum SomeColors
{
Black,
Blue,
Red
}
Тогда выполнение кода все равно будет работать, но при повторной компиляции будут ошибки компилятора, так как SomeColors.Blue
не будет работать. Кроме того, Enum.Parse
будет (в этом случае, в зависимости от настройки чувствительности к регистру) работать в зависимости от того, какая версия SomeColors была доступна для работающего кода.
Однако добавление значений не является серьезным изменением. Если мы взяли первое и изменили его на:
public enum SomeColors
{
Black,
blue,
red,
green
}
Тогда весь существующий код будет в порядке, но, конечно, не будет знать о green
, если не найден с Enum.Parse
.
Итак, если вы только собираетесь добавить, и если вы можете зависеть от того, что никто не пытается Enum.Parse
строки из более поздней версии, тогда это будет работать.
То же самое относится к const
значениям.
Если вам нужно, чтобы значения были изменяемыми с версиями, тогда вы должны использовать:
public static class SomeColors
{
public static readonly int Black = 0;
public static readonly int Blue = 1;
public static readonly int Red = 2;
}
Поскольку это не константы, а поля, назначаемые статически, они будут использоваться из класса, а не скомпилированы, и изменения в классе изменят то, что используется. Дальнейшая безопасность в некоторых случаях может быть обеспечена путем придания им свойств, а не полей; в частности, если вы захотите создать вычисляемые свойства в будущем, это будет серьезным изменением, если они в настоящее время являются полями, но не если они уже являются свойствами.
Если вы хотите, чтобы значения были динамическими во время выполнения, вам нужен класс с индексатором, который принимает строку и возвращает целое число.