2009-03-05 114 views
67

我在做一些關於枚舉的閱讀,並發現它們與聲明常量非常相似。我怎麼知道什麼時候使用常量而不是枚舉,反之亦然。使用枚舉有哪些優點?枚舉和常量。哪個使用時?

+0

另請參閱http://stackoverflow.com/questions/755685/c-static-readonly-vs-const – 2014-12-15 15:36:36

+0

另請參閱http://stackoverflow.com/questions/11575376/why-use-enums-instead-of Java的類似問題的常量(答案大多也適用於C#)。 – 2015-08-08 21:09:44

回答

68

當您想要定義某些可能的值的範圍時使用枚舉。顏色就像是一個明顯的例子:

public enum Colour 
{ 
    White, 
    Red, 
    Blue 
} 

或許就像一組可能的事情: (例子,我從here偷因爲我懶)

[FlagsAttribute] 
enum DistributedChannel 
{ 
    None = 0, 
    Transacted = 1, 
    Queued = 2, 
    Encrypted = 4, 
    Persisted = 16, 
    FaultTolerant = Transacted | Queued | Persisted 
} 

常量應該是一個單一的價值,像PI一樣。沒有一系列的PI值,只有PI。

+0

如果你最終在enum上使用`.ToString()`,那麼在使用一個類似於一個枚舉但看起來和行爲像一個枚舉的類的任何值時,會繞過對`ToString()`的調用? [示例](https://hastebin.com/exehipiwut.cs) – Sinjai 2018-01-29 00:28:01

16

常量是一種語言特性,它表示變量不會改變值(因此編譯器可以對該知識進行優化),其中枚舉是特定類型。

常量可以是任何數據類型,但枚舉是一個枚舉。

我使用枚舉任何地方,你可以有多個選項,並希望提高代碼的可讀性。即您可以將跟蹤級別作爲值爲0,1,2的int或作爲錯誤,警告和信息的枚舉。

Enum也可以用作按位運算符,即FontStyle.Bold | FontStyle.Italic會給你粗體和斜體字體。

5

除了羅伯特的回答是:

  1. 爲一組有限的命名值的使用枚舉。你並不關心每個符號背後的數值(但你仍然有能力施加這些數值,例如爲了與遺留系統兼容)。

  2. Robert:是的,Enum's可以用作位域。使用Flags屬性(並確保枚舉的成員具有合適的數值)。

3

C#常量類似於一個變量,因爲它給一個值定義了一個名稱。但是,常數與標準變量不同,因爲一旦定義,賦值給常量的值永遠不會改變。常量的主要好處是它們可以幫助創建自我記錄代碼,並允許在一個地方聲明關鍵值,如果需要更新值並重新編譯軟件,則可以輕鬆進行維護。

儘管枚舉器列表對於定義序列和狀態非常有用,特別是當通過這些狀態有自然進展時。這是因爲列表中的每個常量都可以使用其名稱或值進行格式化和比較。枚舉也可以用來定義一組有限的有效值。

22

其他答案中缺少的是枚舉有一個整數基類型。您可以從int到任何其他整數類型,除了像炭更改默認:

enum LongEnum : long { 
    foo, 
    bar, 
} 

您可以顯式轉換和隱式的基本類型,這是在開關語句是有用的。請注意,即使枚舉沒有具有適當值的成員,也可以將任何基類型的值轉換爲枚舉。因此,在交換機中始終使用默認部分是個不錯的主意。順便說一句,.NET本身甚至允許浮點值枚舉,但你不能用C#定義它們,儘管我認爲你仍然可以使用它們(除了在switch中)。

此外,使用枚舉爲您提供更多的類型安全性。如果您打算使用例如int常量作爲方法參數,然後我可以用任何int值調用該方法。當然,通過投射也可以發生枚舉,但它不會意外發生。更糟的是可能會混淆參數的順序。

void method(int a, int b) {...} 

如果常數A僅可以進入和常數B僅可以進入B,然後用兩種不同的枚舉類型將揭開編譯期間的任何誤操作。

相關問題