2009-01-29 40 views
13

所以我一直在尋找這是在查了一些代碼,我得到了所有困惑了:應該用靜態變量替換枚舉嗎?

// Amount of days before cancellation can't be done 
enum Cancellation { Limit = 2 }; 

問起是誰檢查了在他認爲,這是更好的使用枚舉而不是靜態變量,bettern比傢伙這:

private static int CANCELLATION_LIMIT = 2; 

所以我們開始爭論。我的觀點是他使用枚舉作爲存儲值的方式(如果有兩個具有相同值的枚舉符號,它會中斷)。他認爲在一個類中有靜態變量是一個反模式。

我的問題是什麼最佳實踐應該用於?

+0

「如果有兩個具有相同值的枚舉符號,它會中斷」 - 否,它不會 - 在同一個定義中,您可以使用相同值具有多個枚舉。無論哪種方式,它應該是`const`。 – 2009-01-29 10:43:23

回答

8

枚舉被鍵入。

也就是說,如果你有一個方法,你必須將某個'狀態'傳遞給一個方法,你只能傳遞'有效'參數。 例如:

enum OrderState 
{ 
    pending = 1, 
    shipped = 2 
} 

public IList<Order> GetOrdersInState(OrderState) 
{ 
} 

這是-imho-使用枚舉的一個很好的例子。 當OrderState是您爲其創建2個常量整數的整型時,您沒有任何限制,並且能夠傳遞無效值。編譯器不會抱怨。

但是,你提出的情況下,我認爲使用枚舉不是一個有效的解決方案。這是對int的濫用,應該使用const int。

枚舉是好的,但它們應該用在他們必須使用的地方。在任何情況下,它們都不是首選工具。 在這種情況下,const或static var不是反模式。

+0

重構並不像枚舉那麼容易,例如如果你選擇由於要求取消限制取決於數據庫條目,因此要使靜態爲實例方法... – Llyle 2009-01-29 10:44:53

0

我認爲你應該使用枚舉,如果你有一組直接連接的值。例如:enum Status {Open = 1,Closed = 2,Waiting = 3};

對於其他一切,我會說靜態變量是要走的路。

0

我不知道在類(?)中使用靜態變量是一種反模式。例如,.Net框架中的Color類有很多靜態公共變量,例如Color.Red。所以,從這個角度來看,我會同意你的看法。

但是,可能會有一個折衷:使用私人常量CANCELLATION_LIMIT = 2;而你們兩個都應該很開心。對他來說,類(?)將不會有全局變量,因爲常量將被編譯器替換,並且您將得到一個明確名稱的單點更改。

12

return「它在邏輯上是一組值嗎」? 「ENUM是適當的」:「靜態常量是好的」

(我是邏輯一致的大風扇)

+0

絕對同意,100%。 C#中的 – 2009-01-29 11:12:29

+0

我不認爲你可以有一個靜態常量。它的任一常量,或靜態只讀:) – Svish 2009-01-29 11:33:55

+1

事實上,所有常量都是隱式靜態的,並且禁止顯式指定(儘管靜態只讀,我會很好) – annakata 2009-01-29 11:41:09

2

不,你如何在枚舉中定義靜態字符串變量或十進制值?

1

我不認爲CANELLATION_LIMIT聽起來像一個枚舉,這通常是一組選擇。

對於不同的東西,如果它是一個const,那麼也許......但現在它是一個可變的場?

注意枚舉僅限於基於整數的類型,所以它不能被用於floatstring

1

對於打算是唯一不變的值,枚舉是要走的路。要問的問題很簡單:對象是否應該存儲值本身,甚至是靜態的?在許多情況下,例如在描述錯誤或行爲時,答案是否定的。請記住,枚舉 S爲誕生於一個替代的#define:它的典型值與標識符相關聯,它提供了一個類型,它實際上並沒有說「這店不斷在這裏。」

我認爲你實際上不想存儲任何東西,但提供這樣的典型值。 static const成員僅當您打算使用它們時纔有用,例如,如果您需要通過引用方法來傳遞它們。