代码中为了调用和管理方便,会把大量的类型定义为枚举值,如:
//定义
public enum SomeTypes{ Type_1, Type_2, Type_n }
//调用
if(SomeTypes.Type_1==otherObj.SomeType){
// do something
}
以上代码,简单又熟悉,但其中隐藏一个隐患,如下:
如果定义和调用在同一个项目(dll)中,没问题;
如果定义和调用不再同一个项目中,有问题;
操作过程:
1. 在a.dll中定义SomeTypes枚举,生成a.dll;
2. 在b.dll中引用a.dll,并调用SomeTypes枚举;
3. 修改a.dll中定义的SomeTypes枚举值,并再次生成a.dll;
通过以上步骤,即使把a.dll替换到b.dll所在目录中,也同样会产生bug.
why?
在第2步骤生成b.dll的时候,编译器会把调用SomeTypes的代码替换成枚举的值,如文章开始的例子,编译后的b.dll中代码如下:
if( 0 ==otherObj.SomeType){ // do something }
所以你新修改的枚举值并不会体现在调用的dll中。