2010-08-06 78 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號沒有我的源代碼中的任何地方出現的值,所以它會如果我部署新版本的程序集,請打破。

保存優雅是我不需要重新編寫來處理這個重大變化,只需重新編譯即可。