添加枚举值是否会中断二进制兼容性?
-
13-12-2019 - |
题
在DLL中想象这个枚举。
public enum Colors
{
Red,
Green
}
.
添加枚举值中断二进制兼容性吗?如果我要改变它,那么现有的exes休息?
public enum Colors
{
Red,
Green,
Blue
}
.
我看到了这个答案,但它似乎解决了插入一个值的情况。如果我向添加值,则只有,那是好吗?
解决方案
否,这不会破坏二进制兼容性(如:组件仍将加载等),因为枚举基本上是整数的文字常量。在中间插入值显然是一个非常危险的想法,但你已经排除在外。
但是,它可能导致若干其他问题您需要防范:
- 一些代码(特别是
switch
语句)可能无法预测新值;从技术上讲,这也是一个问题,因为枚举不是值检查的(枚举变量可以包含未定义的值) - 查询可用枚举的任何东西都将得到不同的结果
-
特别地,如果使用由特定客户端尚未预期的enums的数据,则序列化和反序列化可能意外地失败
其他提示
应该很好,假设你只附加到最后。然而,破坏的风险来自于枚举in隐含地定义的事实,从0开始。因此,如果有人持续到DB的值,则风险更改其映射到的值。
作为示例,如果您将枚举更改为:
public enum Colors
{
Blue,
Red,
Green
}
.
在他们的dbs中存储这些值的任何人都会看到曾经是红色的东西,现在是蓝色的,而绿色现在是红色的。
理想情况下,您应该像:
一样定义枚举public enum Colors
{
Red = 0,
Green = 1
}
.
然后,当您添加新的时,您应该有:
public enum Colors
{
Red = 0,
Green = 1,
Blue = 2
}
.
这将有助于防止任何潜在的版本处理问题。
不隶属于 StackOverflow