添加枚举值会破坏二进制兼容性吗?
想象一下这个枚举在一个DLL中。添加枚举值会破坏二进制兼容性吗?
public enum Colors
{
Red,
Green
}
是否添加枚举值会破坏二进制兼容性?如果我要改变它,现有的EXE会破坏吗?
public enum Colors
{
Red,
Green,
Blue
}
我看到this answer,但它似乎解决插入值的情况。如果我将值添加到最后只有,那可以吗?
不,这不会破坏二进制兼容性(尽可能:程序集仍然会加载等),因为枚举基本上是整型文字常量。在中间插入值显然是一个非常危险的想法,但您已经排除了这一点。
但是,它可能会导致一些你需要警惕的其他问题:
- 一些代码(
switch
报表尤其是)可能没有预料到的新值;技术上,这是之前太问题,因为枚举不是价值的检查(枚举变量可以包含未定义的值) - 任何查询可用的枚举是会得到不同的结果 特别
- ,序列化和反序列化可能会失败不料,如果有使用枚举那些尚未被特定的客户端
应该没事预期,假设你只追加到年底的数据。但是,破坏的风险来自枚举值是隐式定义的,从0开始。因此,如果有人将这些值保存到数据库中,则可能会更改它们映射的值。
举个例子,如果你改变了你的枚举是:
public enum Colors
{
Blue,
Red,
Green
}
任何人谁在自己的DB中存储这些值会看到的东西,曾经红,现在是蓝的,什么是绿色,现在是红。
理想情况下,你应该定义你的枚举,如下所示:
public enum Colors
{
Red = 0,
Green = 1
}
然后,当你添加一个新的,你应该有:
public enum Colors
{
Red = 0,
Green = 1,
Blue = 2
}
这将有助于防止任何潜在的版本问题。
+1。如果可以的话,我也会给这个绿色支票。这是使枚举更加坚固的巧妙方法。 – TheBuzzSaw
请注意,规范明确指出,如果您未指定任何值,则它将从0开始,并为每个值递增1,因此不像第一种情况下的后备整数是未定义的行为。你可以添加到最后。 – Servy
没错,但是你必须把它添加到最后,否则就会崩溃。 –
太棒了。我能做些什么来抵制破损?显然,如果我按照自己的方式行事,我不会追加枚举,但是考虑到情况,处理这个问题的最安全方法是什么?在switch语句(双关意外)的情况下,是否指定了'default:'槽以防止更改? – TheBuzzSaw
@TheBuzzSaw抵制破坏的最好方法是不要将枚举用于任何你希望在时间结束前不会保持不变的东西。 – Servy
@Servy同意...但由于我现在被enums卡住了,你还有什么? ;) – TheBuzzSaw