2010-08-06 50 views
6

考虑下面的代码:正在改变一个枚举的突破变化的数量?

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

会改变OTH = 5OTH = 7是一个重大更改?


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

回答

12

这是一个突破性的改变,因为你正在改变一个公共API。

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

从MSDN - enum (C# Reference)

正如任何常量,以枚举的单独的值均引用在编译时转换为数字文字。这可能会产生潜在的版本问题,如常量(C#编程指南)中所述。

+0

感谢您的支持。所有我需要的信息。 – cjk 2010-08-06 08:59:32

3

这取决于您是否拥有对解决方案的完整代码的控制权,或者您是否在导出供他人使用的库。

  • 也许以下的不如果所有属实
    • 如果只是供自己使用
    • 你重建所有
    • 你只使用枚举
    • 你不要存储序号,将它们保存在数据库中。
  • 如果有以下为真
    • 如果别人使用你的图书馆,并且不重新编译,并且不使用特定版本参考(假设你的递增构建版本)或签名参考。其他代码将保存它自己的序数值副本,现在不匹配。
    • 您使用显式强制对序号值
    • 您序列化数据并希望使用旧的“保存档案”

有与公开曝光consts类似的陷阱。

一般来说,假设是 - 这是一个突破!

+1

即使你是唯一的消费者,它仍然可能是一个突破性的改变。如果代码中的任何地方在int值之间进行投票以获取枚举值,则可能导致异常或(更糟糕)返回错误的值。例如,通过使用表的主键作为枚举的值,将数据库中的值映射到枚举并不少见。 – 2010-08-06 08:48:51

2

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

0

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

+0

这不是一个错字,因此改变它的问题。它永远不会在开关状态中使用,所以没有编译时错误。 – cjk 2010-08-06 08:58:34

0

这取决于。只有在您确认没有人依赖其值为5或与SSN相同的值时,或者您可以重构这种依赖关系时,才会发生这种非重大更改。

2

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

如果我写对本次大会类似的代码:

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

然后在内部是比较它的5尽管5号没有我的源代码中的任何地方出现的值,所以它会如果我部署新版本的程序集,请打破。

保存优雅是我不需要重新编写来处理这个重大变化,只需重新编译即可。