Подтвердить что ты не робот

Увеличивает ли добавление значений enum бинарную совместимость?

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

public enum Colors
{
    Red,
    Green
}

Увеличивает ли добавление значений enum бинарную совместимость? Если бы я изменил его, исчезли бы существующие EXE?

public enum Colors
{
    Red,
    Green,
    Blue
}

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

public enum Colors
{
    Blue,
    Red,
    Green
}

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

В идеале вы должны определить свое перечисление следующим образом:

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

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

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

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