Рассмотрим следующий код:
public enum SomeCode
{
NIF = 0
,NIE = 1
,CIF = 2
,PAS = 3
,NIN = 4
,SSN = 5
,OTH = 5
,UKN = 6
}
Будет ли изменение OTH = 5
на OTH = 7
нарушением изменить?
Редактировать: Я никогда не храню значение типа int, только текстовое представление перечисления. Он может использоваться в других библиотеках DLL, но будет использовать то же хранилище.
] Это критическое изменение, поскольку вы меняете общедоступный API.
Библиотеки / приложения, которые были созданы со старым значением, по-прежнему будут хранить старое значение и использовать его. Вам нужно будет их все перекомпилировать.
Из MSDN - перечисление (C # Ссылка) :
Как и в случае с любой константой, все ссылки на отдельные значения перечисления преобразуются в числовые литералы во время компиляции. Это может создать потенциальные проблемы с управлением версиями, как описано в Константах (Руководство по программированию на C #).
Хотя это правда, что это не критическое изменение, если никто не зависит от его значения 5, стоит отметить, что любой, кто его использует, зависит от его значения 5, даже если это не так. явным образом в их коде.
Если я напишу код для этой сборки, например:
if(myVal == SomeCode.OTH)
{
//do something
}
Тогда он будет сравнивать его со значением 5. Даже если число 5 нигде в моем исходном коде не появляется, оно сломается, если я разверну новая версия сборки.
Изящество экономии в том, что мне не нужно переписывать, чтобы иметь дело с этим критическим изменением, просто перекомпилируйте.
Это зависит от обстоятельств. Это не критичное изменение, только если вы можете убедиться, что никто не зависит от его значения 5 или такого же, как SSN, или если вы можете выполнить рефакторинг такой зависимости.
Во-первых, SSN и OTH = 5, это опечатка, иначе это ошибка времени компиляции для оператор switch с использованием этого перечисления?
Теперь, если изменить OTH = 5 на OTH = 7, это будет нарушением, если вы используете enum как SomeCode someCode = (SomeCode) 5
.
Это зависит от того, контролируете ли вы весь код своего решения или экспортируете ли вы библиотеку для использования другими.
Есть похожие проблемы с общедоступными константами.
В общем, допустим, да - это критическое изменение!
Так и будет. Предположим, вы храните некоторые данные как int из перечисления, извлечение этих данных в будущем даст неверные результаты. В данном случае данные, сохраненные для OTH до изменения, не будут отображаться как OTH, поскольку вы храните 5 для OTH в настоящее время и получите 5 в будущем, а вам нужно 7 для того же самого.