15

想象一下 DLL 中的这个枚举。

public enum Colors
{
    Red,
    Green
}

添加枚举值会破坏二进制兼容性吗?如果我要更改它,现有的 EXE 会损坏吗?

public enum Colors
{
    Red,
    Green,
    Blue
}

我看到了这个答案,但它似乎解决了插入值的情况。如果我只在末尾添加值,可以吗?

4

2 回答 2

23

不,这不会破坏二进制兼容性(就像:程序集仍将加载等),因为枚举基本上是整数文字常量。在中间插入值显然是一个非常危险的想法,但您已经排除了它。

但是,它可能会导致您需要防范的许多其他问题:

  • 某些代码(switch尤其是语句)可能无法预料到新值;从技术上讲,这也是一个问题,因为枚举没有经过值检查(枚举变量可以包含未定义的值)
  • 任何查询可用枚举的东西都会得到不同的结果
    • 特别是,如果存在使用特定客户端尚未预期的枚举的数据,则序列化和反序列化可能会意外失败
于 2012-10-03T20:06:09.323 回答
3

应该没问题,假设你只追加到最后。但是,中断的风险来自于枚举值是隐式定义的,从 0 开始。因此,如果有人将值持久保存到数据库,则可能会更改它们映射到的值。

例如,如果您将枚举更改为:

public enum Colors
{
    Blue,
    Red,
    Green
}

将这些值存储在数据库中的任何人都会看到曾经是红色的东西现在是蓝色的,而现在是绿色的东西现在是红色的。

理想情况下,您应该像这样定义您的枚举:

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

然后,当你添加一个新的,你应该有:

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

这将有助于防止任何潜在的版本控制问题。

于 2012-10-03T20:16:26.440 回答