Меняет ли номер перечисления прерывание изменить?

Рассмотрим следующий код:

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, но будет использовать то же хранилище.

7
задан Aza 15 April 2013 в 03:27
поделиться

6 ответов

] Это критическое изменение, поскольку вы меняете общедоступный API.

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

Из MSDN - перечисление (C # Ссылка) :

Как и в случае с любой константой, все ссылки на отдельные значения перечисления преобразуются в числовые литералы во время компиляции. Это может создать потенциальные проблемы с управлением версиями, как описано в Константах (Руководство по программированию на C #).

12
ответ дан 6 December 2019 в 09:57
поделиться

Хотя это правда, что это не критическое изменение, если никто не зависит от его значения 5, стоит отметить, что любой, кто его использует, зависит от его значения 5, даже если это не так. явным образом в их коде.

Если я напишу код для этой сборки, например:

if(myVal == SomeCode.OTH)
{
    //do something
}

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

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

2
ответ дан 6 December 2019 в 09:57
поделиться

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

0
ответ дан 6 December 2019 в 09:57
поделиться

Во-первых, SSN и OTH = 5, это опечатка, иначе это ошибка времени компиляции для оператор switch с использованием этого перечисления? Теперь, если изменить OTH = 5 на OTH = 7, это будет нарушением, если вы используете enum как SomeCode someCode = (SomeCode) 5 .

0
ответ дан 6 December 2019 в 09:57
поделиться

Это зависит от того, контролируете ли вы весь код своего решения или экспортируете ли вы библиотеку для использования другими.

  • Может быть, нет , если все из следующего верны
    • Если это только для вашего собственного использования
    • Вы перестраиваете все
    • Вы используете только перечисление
    • Вы не сохраняете порядковый номер, не приводите к нему / из него, не сохраняете в базе данных.
  • Да , если верно хоть одно из следующих утверждений.
    • Если кто-то другой использует вашу библиотеку и не перекомпилирует, и не использует ссылку на конкретную версию (при условии, что вы увеличиваете версию сборки) или подписанную ссылку. Другой код сохранит свою собственную копию порядкового номера, которая теперь не совпадает.
    • Вы используете явное приведение типов к порядковому значению
    • Вы сериализуете данные и хотите использовать старые «файлы сохранения»

Есть похожие проблемы с общедоступными константами.

В общем, допустим, да - это критическое изменение!

3
ответ дан 6 December 2019 в 09:57
поделиться

Так и будет. Предположим, вы храните некоторые данные как int из перечисления, извлечение этих данных в будущем даст неверные результаты. В данном случае данные, сохраненные для OTH до изменения, не будут отображаться как OTH, поскольку вы храните 5 для OTH в настоящее время и получите 5 в будущем, а вам нужно 7 для того же самого.

2
ответ дан 6 December 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: