改变枚举类型的数字是否会导致破坏性变更?

7

Consider the following code:

public enum SomeCode
{
     NIF = 0
    ,NIE = 1
    ,CIF = 2
    ,PAS = 3
    ,NIN = 4
    ,SSN = 5
    ,OTH = 5
    ,UKN = 6
}

OTH = 5更改为OTH = 7是否会导致破坏性变更?

编辑:我从不存储int值,只存储枚举的文本表示。它可能在其他DLL中使用,但将使用相同的存储。

6个回答

13

这是一个重大的变化,因为您正在更改公共API。

使用旧值构建的库/应用程序仍将保留旧值并使用它。 您需要重新编译它们全部。

来自MSDN-枚举(C#参考)

正如任何常量一样,枚举各个值的所有引用在编译时都会转换为数字字面值。 这可能会创建潜在的版本控制问题,如常量所述(C#编程指南)。


3
这取决于您是否完全控制解决方案的所有代码,或者是否正在导出供他人使用的库。 如果以下所有条件都成立,则可能不会有问题
  • 仅供个人使用
  • 您重建了全部内容
  • 仅使用枚举
  • 不存储序数值,也不进行强制转换或在数据库中持久化。
如果以下任何条件成立,则需要更新
  • 其他人使用您的库,但不重新编译,并且不使用特定版本引用(假设您增加了构建版本)或签名引用。其他代码将保存其自己的序数值副本,但此时与您的版本不匹配。
  • 对序数值使用显式转换
  • 序列化数据并希望使用旧的“save-files”
公开的常量也存在类似的问题。
总体而言,应该假定需要更新-这是一种破坏性变更!

1
即使您是唯一的使用者,它仍然可能是一个破坏性的变化。如果在您的代码中任何地方进行整数值到枚举值的转换,这可能会导致异常或(更糟糕的是)返回错误的值。例如,通常使用表的主键作为枚举值的值来将数据库中的值映射到枚举。 - Dan Diplo

2

会的。假设您将一些数据作为枚举的int存储,将来检索数据将会给出错误的结果。对于这种情况,更改之前存储的OTH数据不会出现为OTH,因为您当前正在将5存储为OTH,而将来您将获得5,并且您需要相同的7。


2

虽然如果没有人依赖它的值为5,这不是一个破坏性的变化,但值得注意的是,任何使用它的人都依赖于它的值为5,即使在他们的代码中没有明确表示。

如果我像这样编写针对这个程序集的代码:

if(myVal == SomeCode.OTH)
{
    //do something
}

然后在内部将其与5的值进行比较。尽管数字5在我的源代码中没有出现过,但如果我部署新版本的程序集,它将会崩溃。

好在我不需要重新编写来处理这种破坏性变化,只需要重新编译即可。


0
首先,SSN和OTH都等于5,这是一个错误吗?否则,在使用此枚举的switch语句中会出现编译时错误。 然后,将OTH的值从5改为7,如果您正在使用枚举作为SomeCode someCode = (SomeCode)5,这将是一个破坏性的变更。

这不是打字错误,所以有关更改它的问题。它从未在 switch 语句中使用,因此不会出现编译时错误。 - cjk

0

这要看情况。如果你可以验证没有人依赖于其值为5或与社会安全号码相同,或者你可以重构掉这样的依赖关系,那么它就是一个非破坏性的更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接