改变枚举的数量是一个突破性的变化吗?

时间:2010-08-06 08:38:47

标签: c# enums

请考虑以下代码:

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 个答案:

答案 0 :(得分:12)

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

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

来自MSDN - enum (C# Reference)

  

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

答案 1 :(得分:3)

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

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

与公开暴露的争论有类似的陷阱。

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

这取决于。只有当您可以验证没有人依赖于其值为5或与SSN相同或者您是否可以重构这种依赖时,这是一个非破坏性的更改。