2013-02-19 219 views
10

我正在尋找一個關於如何創建枚舉類的最佳做法,而不是數字包含字符串值。 事情是這樣的:類枚舉類

public static class CustomerType 
{ 
    public static string Type1 = "Customer Type 1"; 
    public static string Type2 = "Customer Type 2"; 
} 

我會用這個類在整個應用程序設置爲我需要CustomerType所有情況下的值。我不能使用Enum,因爲這是遺留系統,像這樣的值在任何地方都是硬編碼的,我只是試圖將它們集中在一個地方。

的問題是,在上面的例子中,我應該使用變量聲明:

  1. 靜態只讀關鍵字
  2. const關鍵字
  3. 或只是靜態

會是什麼設置這些類和值的最佳實踐?

+2

請參閱http://stackoverflow.com/questions/3190870/const-string-vs-static-string-in-c-sharp。 – nneonneo 2013-02-19 07:01:00

回答

13

您應該而不是使用普通static,因爲這些字段可能會被無意中修改並導致神祕的破壞。因此,您的兩個選擇是static readonlyconst

const將導致變量的值在編譯時被嵌入到調用代碼中,這將實際上等同於舊的硬編碼代碼(但具有符號常量的優點)。 const的危險在於,如果const更改,您必須重新編譯所有內容,否則最終會出現不同步的常量和棘手的錯誤。

static readonly將導致正常的字段訪問,所以你不會有同步問題。但是,由於額外的字段訪問權限,您可能會受到輕微的性能影響(儘管除非您在性能關鍵的代碼中使用這些字段,否則可能並不明顯)。如果您認爲將來必須更改字符串,則需要使用static readonly

從它的聲音來看,值會變得很少,const是一個安全的賭注。然而,最終的決定取決於你。

2

如果您使用的是C#,爲什麼不創建一個枚舉並設置string基於Descriptionattributeenum值如下:

public enum CustomerType 
{ 
    [System.ComponentModel.Description("Customer Type 1")] 
    Type1, 

    [System.ComponentModelDescription("Customer Type 2")] 
    Type2 
} 

然後,你可以得到枚舉值的Description值如下:

int value = CustermType.Type1; 
string type1Description = Enums.GetDescription((CustomerType)value); 

對於各種其他方式獲得枚舉的Description屬性值,請參閱本SO QA

+3

它太「黑客」了,它不是直截了當的,你需要做額外的投射,代碼不清晰。你也可以像Enums.GetDescription((CustomerType)CustermType.Type1);但是,如果我可以用字符串CustermType.Type1String直接向前,那又有什麼意義呢?無論如何,我之前不知道關於Description屬性:) – 2013-02-19 13:28:08