在「默認」成員的abscence,我認爲這是有價值的有代表一種價值的文字INT 0
不管如何,一個給定的枚舉將與文字值0創建最直接向前的情況下,這是作爲一個結構的成員。 C#結構將始終有一個空的默認構造函數,它將所有字段初始化爲默認值。在枚舉的情況下,這將是字面值0.問題是如何處理它。
對我來說,這是一個風格問題:如果enum沒有明確地初始化爲一個值,應該給它一個任意的有效值還是一個指明缺少顯式初始化的特定值?
enum Color { Unknown, Red, Blue }
enum Color2 { Red,Blue }
struct Example<T> {
Color color;
}
static void SomeMethod() {
var v1 = new Example<Color>();
var v2 = new Example<Color2>();
}
在v1的情況下,如果檢查色域,它將顯式標記爲未初始化的域。在第2版中,該字段很簡單,就是「紅色」。程序員無法檢測到顯式設置爲「紅色」或隱式默認值爲「紅色」。
這導致問題的另一種情況是針對枚舉值執行switch語句。讓我們稍微改變Color2的定義。
enum Color2 { Red = 1, Blue = 2 }
static void SomeOtherMethod(p1 as Example<Color2>) {
switch (p1.color) {
case Color.Red: {}
case Color.Blue: {}
default: {throw new Exception("What happened?"); }
}
}
該開關處理枚舉中的每個顯式值。然而,這個代碼將失敗,例如<Color2>的默認構造函數,並且無法抑制此構造函數。
這帶來了一個性能稍微更重要的規則:有文字值0
同意,最乾淨的解決方案是可空類型。它也很好地映射到DB模式。 – 2008-12-06 02:52:17
不幸的是,.NET中的枚舉不會強制您傳遞有效的值。我可以通過(Color)123123編譯並運行得很好--Draw方法將需要進行驗證:( – 2008-12-06 08:11:01
可能是C的繼承,編譯器不知道枚舉是否被用作真正的枚舉類型,或者作爲一組標誌,因此它將手放在空中投降 – 2008-12-06 13:31:17