Увеличивает ли добавление значений enum бинарную совместимость?
Представьте это перечисление в DLL.
public enum Colors
{
Red,
Green
}
Увеличивает ли добавление значений enum бинарную совместимость? Если бы я изменил его, исчезли бы существующие EXE?
public enum Colors
{
Red,
Green,
Blue
}
Я видел этот ответ, но, похоже, он рассмотрел случай вставки значения. Если я добавлю значения в только для конца, это ОК?
Ответы
Ответ 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
}
Это поможет предотвратить любые возможные проблемы с версиями.