Не нарушает ли добавление значений 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
}
Это поможет предотвратить возможные проблемы с версиями.