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

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

public enum Colors
{
    Red,
    Green
}

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

public enum Colors
{
    Red,
    Green,
    Blue
}

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

2 ответа

Решение

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

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

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

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

Например, если вы изменили свой enum на:

public enum Colors
{
    Blue,
    Red,
    Green
}

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

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

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

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

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

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

Другие вопросы по тегам