改变枚举的数量是一个重大改变吗?

请考虑以下代码:

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中使用,但将使用相同的存储。

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

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

来自MSDN – enum(C#参考) :

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

这取决于您是否可以控制解决方案的完整代码,或者是否要导出其他人使用的库。

  • 如果以下所有情况都属实, 可能不会
    • 如果它只是供您自己使用
    • 你重建所有
    • 您只使用枚举
    • 您不会将序号存储到/从中存储,并在数据库中保留。
  • 是,如果满足以下任何条件,则为是
    • 如果其他人正在使用您的库并且不重新编译,并且不使用特定于版本的引用(假设您正在增加构建版本)或签名引用。 其他代码将保存自己的序数值副本,该副本现在不匹配。
    • 您对序数值使用显式强制转换
    • 您序列化数据,并希望使用旧的“保存文件”

公开暴露的争论也有类似的问题。

一般来说,假设是 – 这是一个突破性的变化!

它会。 假设您从枚举中将一些数据存储为int,将来检索数据会产生错误的结果。 对于这种情况,在更改之前为OTH存储的数据将不会显示为OTH,因为您目前为OTH存储5个,并且将来将获得5个,并且您需要7个相同的数据。

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

如果我针对这个程序集编写代码,如:

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

然后在内部将它与值5进行比较。即使数字5没有出现在我的源代码中的任何地方,所以如果我部署新版本的程序集它将会中断。

节省的优点是我不需要重写来处理这个重大变化,只需重新编译。

首先,SSN和OTH = 5,是不是错误,否则使用此枚举的switch语句的编译时错误? 现在,将OTH = 5更改为OTH = 7,如果使用enum作为SomeCode someCode = (SomeCode)5 ,则会发生变化。

这取决于。 只有当您可以validation没有人依赖于其值为5或与SSN相同或者您是否可以重构此类依赖关系时,这是一个不间断的更改。