2013-04-03 72 views
4

這是一種duplicate question,但沒有真正的解決方案。避免循環定義的const Enum的最佳做法命名約定

所以,我們走吧。可以說我有:

public enum Color 
{ 
    Red, 
    Blue, 
    Green 
} 

public class BlueUnicorn 
{ 
    private const Color Color = Color.Blue; 
} 
  1. 「用於大多數枚舉類型單數名稱,但使用枚舉類型是位域複數的名字。」從Microsoft's Enumeration Type Naming Guidelines撤回檢查!

  2. 「考慮賦予屬性與其類型相同的名稱。」 retreived from Microsoft's Names of Type Members 檢查!

  3. 我應該使用恆定的,而不是隻讀,根據ReSharper的enter image description here檢查!

但我得到一個編譯器錯誤。這很奇怪,對此沒有任何智能感知。 'BlueUnicorn.Color'常數值的評估涉及一個循環定義。

我覺得我在這裏的公約破解。應根據最佳實踐命名約定來命名該字段?

+0

我可以建議將'Color'重命名爲'ColorChoice'用於enum還是BlueUnicorn const? – Kane

+0

@Kane:這是什麼理由?我認爲它不合適。 –

+1

這是有點偏離 - 儘管Resharper的建議,我會使用只讀而不是常量的任何公衆不是一個自然常數。 (就像一天或某事_never_改變)。原因:常量被複制並且未被引用。因此,如果上面的代碼位於ClassLibrary A中,並且exe B引用了A,並且您構建了,則Color.Blue值會被複制到exe B.這意味着如果您釋放了一個新版本的類lib,它將更改const值到綠色,你的exe將繼續使用藍色,直到你重新編譯它。 – JMarsch

回答

4

您可以按照您的方式命名該字段。要解決編譯錯誤,只需在Color.Blue之前添加枚舉的名稱空間即可。

+0

我打賭ReSharper建議刪除名稱空間,因爲限定符是多餘的,哈哈 –

+0

@Grant:不幸的是,是的。但是這實際上是一個錯誤,因爲它不是*冗餘的。 –

+1

我報道了[這裏](http://youtrack.jetbrains.com/issue/RSRP-353104) –

2

你不是在一個公約破解(偉大的術語!)。公約(2)不適用於屬性,不適用於字段或常量。因此,你可以稱之爲UnicornColor。作爲一個便箋,我明白這可能不是你真正的代碼(除非你真的寫一個獨角獸模擬器!),但在我看來,有一個BlueUnicorn類是不正確的。有一個類是根據該類中的特定常量定義的,似乎過於具體 - 當然Color將是Unicorn類的屬性?

我不知道這是否適用於您的真實代碼,但它可能是您的設計有點錯了,而且這個問題從未出現過?