2011-02-10 27 views
7

爲什麼很多人不枚舉這種方式:什麼是使用int的點作爲枚舉

public enum EmployeeRole 
{ 
    None = 0, 
    Manager = 1, 
    Admin = 2, 
    Operator = 3 
} 

,而不是僅僅做:

public enum EmployeeRole 
{ 
    None, 
    Manager, 
    Admin, 
    Operator 
} 

是否有優勢?

回答

4

有優勢嗎?

可維護性。假設這些整數值最終保存在數據庫中。您不希望在將來爲枚舉添加新值,並且由於您以一種移動未指定值的方式插入值,因此值會更改。

清晰度。顯性是一件好事。我們再說一遍,我們正在從一些遺留應用程序的數據庫中讀取整數。所以代碼已經有了特定的含義,我們希望明確地與它們對齊。我們可以說

public enum EmployeeRole { 
    None, 
    Manager, 
    Admin, 
    Operator 
} 

,也許將各行正好與原有規範,或者我們可以說

public enum EmployeeRole { 
    None = 0, 
    Manager = 1, 
    Admin = 2, 
    Operator = 3 
} 

,現在它更容易閱讀,我們是否不排隊與原有規範。

0

它有助於避免因爲有人重新排列類而讓這些假定的常量值發生變化。假設你有一個新員工,其判定「無」應該在列表後面:

public enum EmployeeRole 
{ 
    Manager, 
    Admin, 
    Operator, 
    None 
} 

好吧,如果你永遠只能直接從EmployeeRole.Whatever訪問這些價值觀,這不是一個巨大的交易。但是我看到的大多數枚舉在某些時候被轉換爲一個整數值,當它們被保存在數據庫中時。這意味着存儲中的所有「無」元素都已轉換爲「經理」。

如果有人僅僅在管理員和操作員之間插入新的EmployeeRole,就會出現同樣的問題。

當您不認爲您的枚舉具有適當的「默認」值時會出現另一個優點。例如,如果有人忘記在ORM中映射EmployeeRole字段,則從存儲庫中提取的對象始終顯示爲None角色(0始終是枚舉的默認值)。根據你的軟件如何處理None,這種錯誤可能會在一段時間內被取消。但是,如果你這樣做:

public enum EmployeeRole 
{ 
    Manager = 1, 
    Admin = 2, 
    Operator = 3 
} 

...然後再結合它與快速失敗的技術,可以迅速趕上,其中提供了一個無效的「0」值錯誤:

public RightsManager GetByEmployeeRole(EmployeeRole role) 
{ 
    Require.That(role.IsDefined()); // throws an exception if role is not defined. 
    // find the rights manager for this role. 
} 
+1

此外,「無」應該幾乎總是爲零,以便枚舉類型的字段被初始化爲合理的默認值。 – 2011-02-10 19:33:57

+0

@Eric Lippert:是的,假設你有一個合理的默認值。 (請參閱我的編輯) – StriplingWarrior 2011-02-10 19:40:59

1

它清楚地表達定義了一個值,而不是讓編譯器在編譯時處理它。在你提供的情況下,除了可讀性和定義明確以外,它確實沒有任何意義。它不會傷害任何東西,並導致相同的MISL中沒有明確設置它們。但是,如果您的枚舉與特定值相關,而這些值並不像上述情況那樣自動遞增,則這種明確的定義非常方便。

public enum MyEnum 
{ 

    First = 1, 
    Second = 2, 
    Eleventh = 11 

} 
2

當你有一個合同的其他地方是非常有用的。如果將枚舉存儲在數據庫中,則需要明確鍵入數字,以確保不會在中間插入新項目而意外重新枚舉枚舉。

0

例如,當您將值存儲在數據庫中時,建議在數字和符號值之間有固定映射。如果你不明確指定數值,編譯器會按順序給它們編號,所以如果你插入一個新的,你會有一個不匹配。

0

我看到兩個主要優點:

  • 給予被realated別的東西(如數據庫值,時間間隔等)的值。請注意,您不需要提供有序的值。例如,它可能是1,23,2和4。
  • 當您需要數字值時,它更具可讀性。