2012-09-14 17 views
5

根據MSDN文檔爲System.Enum類的最佳實踐部分:爲什麼枚舉中的位置標記(如第一個或最後一個)被認爲是不良實踐?

不要僅僅定義枚舉值,以反映枚舉本身的狀態。例如,不要定義枚舉常量,僅僅標記枚舉的結尾。如果您需要確定枚舉的最後一個值,請明確檢查該值。另外,如果範圍內的所有值均有效,則可以對第一個和最後一個枚舉常量執行範圍檢查。

如果我理解正確,我們不應該聲明一個枚舉如下。

public enum DrawOrder 
{ 
    VeryBottom = 0, 
    Bottom = 1, 
    Middle = 2, 
    Top = 3, 
    Lowest = VeryBottom, //marks a position in the enum 
    Highest = Top, //marks a position in the enum 
} 

爲什麼這被認爲是不好的做法?

+1

我想這是一個從C/C++繼承的做法。在.NET世界中,我們有'Enum.IsDefined','Enum.GetValues'等,所以黑客沒有什麼意義了。 –

回答

2

因爲這些值可能隨時間而改變。假設你設置一個屬性(使用你的例子)DrawOrder.Highest並將它存儲在你的數據庫/文檔/其他數據接收器中。

時間流逝。

代碼更改。

你的DrawOrder枚舉已經獲得了幾個值,你的持久數據中的值現在不再等於DrawOrder.Highest。它只等於在數據被保存時映射到的任何DrawOrder.Highest

您是否認爲這種情況可能會導致問題?

+0

儘管所有答案都是相似的,但我最喜歡這個解釋。謝謝! – Osiris

2

我不確定我是否認爲這是不好的做法;這取決於。

史蒂夫麥康奈爾的代碼完整使用此構造。 (這本書開始顯示其年齡與它使用的語言,所以這種技術可能已經良好做法呢。)

的缺點是,有一個額外的事情要記住,如果你更新枚舉清單做:如果需要,更新Highest和/或Lowest的值。如果你忘記了,你會引入錯誤。

好處在於您爲循環編寫的代碼更快速且自我記錄。

2

因爲如果您將VeryTop = 4添加到枚舉中,您必須記得更新Highest

如果你不這樣做,所有的地獄崩潰。在一段時間(幾個月)過去之後,忘記這一點令人驚訝地很容易。

1

如果你堅持Enum並且有可能改變枚舉,我會說這只是一個壞主意。如果你不堅持它,或者沒有改變枚舉的機會,那麼在大多數情況下它可能是好的。但是,一個標記的全部重點是因爲價值可能會改變......所以它沒有任何意義。

但是,當使用這樣的構造時,他們使用它們實際打算的枚舉時需要小心。如果你的意思是Top,但是使用Highest代替......然後再添加SuperTop並將其改爲Highest,那麼你的初衷可能就是一個錯誤。

標記枚舉應該只在你想使用任何最高或最低值時使用,不管它的值如何。

許多人認爲這是一種糟糕的做法,因爲當您打算使用特定的價值時,使用標記非常容易。

相關問題