Нарушает ли добавление значений перечисления двоичную совместимость?

StackOverflow https://stackoverflow.com//questions/12715951

  •  13-12-2019
  •  | 
  •  

Вопрос

Представьте себе это перечисление в DLL.

public enum Colors
{
    Red,
    Green
}

Нарушает ли добавление значений перечисления двоичную совместимость?Если бы я изменил его, сломались бы существующие EXE-файлы?

public enum Colors
{
    Red,
    Green,
    Blue
}

Я видел этот ответ, но, похоже, речь шла о случае вставка ценность.Если я добавлю значения в только конец, это нормально?

Это было полезно?

Решение

Нет, это не нарушает двоичную совместимость (в том числе:сборка все равно будет загружаться и т. д.), поскольку перечисления по сути представляют собой целочисленные константы-литералы.Вставка значений посередине, очевидно, очень опасная идея, но вы это уже исключили.

Однако это может вызвать ряд других проблем, от которых вам следует остерегаться:

  • какой-то код (switch высказывания в частности) могут не предвидеть новые ценности;технически это было проблемой и раньше, поскольку перечисления не проверяются по значениям (переменные перечисления могут содержать неопределенные значения)
  • все, что запрашивает доступные перечисления, получит разные результаты
    • в частности, сериализация и десериализация могут неожиданно завершиться неудачей, если существуют данные, использующие перечисления, которые еще не ожидаются конкретным клиентом.

Другие советы

Это должно быть хорошо, предполагая, что вы только добавляете только до конца.Тем не менее, риск разрыва придет от того факта, что значения enum неявно определяются, начиная с 0. Итак, если кто-то сохраняет значения в БД, вы рискуете изменять, какие значения они отображаются.

в качестве примера, если вы изменили свой Enum:

public enum Colors
{
    Blue,
    Red,
    Green
}
.

Любой, кто хранит эти ценности в своих DBS, увидит, что вещи, которые когда-то были красными, теперь синим, а то, что было зеленым теперь красным.

В идеале вы должны определить вашу enum так:

public enum Colors
{
    Red = 0,
    Green = 1
}
.

А затем, когда вы добавляете новый, у вас должно быть:

public enum Colors
{
    Red = 0,
    Green = 1,
    Blue = 2
}
.

Это поможет предотвратить любые потенциальные проблемы для версий.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top