2010-08-06 3 views
6

Рассмотрим следующий код:Изменяет ли количество переименований перерыв?

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

ответ

12

Это измененное изменение, так как вы меняете общедоступный API.

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

Из MSDN - enum (C# Reference):

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

+0

Спасибо за это. Мне нужна вся информация. – cjk

3

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

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

Есть подобные подводные камни с публично подвергаются consts.

В общем, предположим, что да - это нарушение!

+1

Это все равно может быть изменением, даже если вы единственный потребитель. Если в любом месте вашего кода вы выбрали значение int для получения значения enum, это может привести к исключениям или (что еще хуже) возврату неправильного значения. Нередко, например, сопоставлять значения в базе данных с перечислением, используя первичный ключ таблицы в качестве значения перечисления. –

2

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

0

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

+0

Это не опечатка, поэтому вопрос об ее изменении. Он никогда не используется в состоянии переключателя, поэтому нет ошибки времени компиляции. – cjk

0

От этого зависит. Это неотрывное изменение, только если вы можете убедиться, что никто не зависит от его значения, равного 5 или того же, что и SSN, или если вы можете реорганизовать такую ​​зависимость.

2

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

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

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

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

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

Смежные вопросы