代碼中爲了調用和管理方便,會把大量的類型定義爲枚舉值,如:spa
//定義
public enum SomeTypes{ Type_1, Type_2, Type_n }
//調用
if(SomeTypes.Type_1==otherObj.SomeType){
// do something
}
以上代碼,簡單又熟悉,但其中隱藏一個隱患,以下:code
若是定義和調用在同一個項目(dll)中,沒問題;blog
若是定義和調用再也不同一個項目中,有問題;編譯器
操做過程:編譯
1. 在a.dll中定義SomeTypes枚舉,生成a.dll;class
2. 在b.dll中引用a.dll,並調用SomeTypes枚舉;引用
3. 修改a.dll中定義的SomeTypes枚舉值,並再次生成a.dll;bug
經過以上步驟,即便把a.dll替換到b.dll所在目錄中,也一樣會產生bug.項目
why?di
在第2步驟生成b.dll的時候,編譯器會把調用SomeTypes的代碼替換成枚舉的值,如文章開始的例子,編譯後的b.dll中代碼以下:
if( 0 ==otherObj.SomeType){ // do something }
因此你新修改的枚舉值並不會體如今調用的dll中。