2009-12-22 139 views
7

我對樣式和性能方面的考慮感興趣。我的選擇是可以使用如下的(對不起,窮人的格式,但這個網站的界面不WYSIWYG):.NET C#switch語句字符串比較與枚舉比較

一:

string value = "ALPHA"; 

switch (value.ToUpper()) 
{ 
    case "ALPHA": 
    // do somthing 
    break; 
    case "BETA": 
    // do something else 
    break; 
    default: 
    break; 
} 

二:

public enum GreekLetters 
{ 
    UNKNOWN= 0, 
    ALPHA= 1, 
    BETA = 2, 
    etc... 

} 

string value = "Alpha"; 
GreekLetters letter = (GreekLetters)Enum.Parse(typeof(GreekLetters), value.ToUpper()); 

switch(letter) 
{ 
    case GreekLetters.ALPHA: 
     // do something 
     break; 
    case GreekLetters.BETA: 
     // do something else 
     break; 
    default: 
     break; 
} 

就個人而言,我更喜歡下面的選項TWO,但除了基本的風格原因,我沒有任何真正的原因。但是,我甚至不確定是否有風格的原因。感謝您的輸入。

+0

它會產生一個很好的面試問題 - 我建議你只能通過分析發現問題,因爲它取決於Enum.Parse()的性能 - 當然,選項兩個從排印錯誤角度來看更容易維護,即使性能可比... – 2009-12-22 17:08:41

+0

+1將枚舉值0標記爲「未知」。 – 2009-12-22 17:40:49

回答

4

選項1的速度更快,因爲如果您的look at the code對於Enum.Parse,您會看到它逐個遍歷每個項目,尋找匹配項。另外,維護和保持一致的代碼更少。

需要注意的一點是,您不應該使用ToUpper,而應該使用ToUpperInvariant(),因爲Turkey Test問題。

如果您堅持選項#2,至少使用允許您指定忽略大小寫的重載。這將比轉換爲大寫字母更快。另外,請注意Framework Design Guidelines鼓勵所有的枚舉值是PascalCase而不是SCREAMING_CAPS。

+2

嚴重的是,SCREAMING_CAPS是sooooo C++ – 2009-12-22 20:55:39

9

第二個選項稍微快一些,因爲第一個選項可能需要全字符串比較。不過,在大多數情況下,這個差別太小而無法衡量。

第二個選項的真正優點是您已明確指出value的有效值屬於狹窄範圍。事實上,如果字符串值不在預期的範圍內,它會在Enum.Parse處引發異常,這通常正是您想要的。

+0

第二個選項較慢,因爲它需要反射命中來收集所有字段,然後逐項比較。我在我的答案中指出框架源代碼來證明這一點。 – 2009-12-22 17:35:30

1

我一定會說#1。 Enum.Parse()導致反射相對昂貴。另外,Enum.Parse()會拋出一個異常,如果它沒有定義,並且因爲沒有TryParse()你需要將它包裝在Try/Catch塊中

2

我不能評論問題的性能部分但至於風格,我更喜歡選項#2。每當我有一組已知的值並且該集合相當小(少於幾十個),我更願意使用枚舉。我發現枚舉比字符串集合更容易處理,任何查看代碼的人都可以快速查看允許的值集合。

0

不確定在切換字符串值與枚舉時是否存在性能差異。

需要考慮的一件事是,您需要用於代碼中其他位置的case語句的值。如果是這樣,那麼使用枚舉會更有意義,因爲你有一個單一的值的定義。 Const字符串也可以使用。

2

這實際上取決於枚舉中的項目數量,您將不得不爲每個特定場景進行測試 - 而不是它可能會產生很大的差異。但這是一個很好的問題。

只有很少的值,Enum.Parse比任何一個例子都要花費更多的時間,所以第二個應該會比較慢。

如果有足夠的值,switch語句將作爲散列表實現,它應該以字符串和枚舉的速度工作,所以Enum.Parse可能會使第二種解決方案變得更慢,但不會相對較慢。

在中間的某個地方,我預計比較字符串的成本高於比較枚舉會使第一個解決方案更快。

如果在不同的編譯器版本或不同的選項上有所不同,我甚至不會感到驚訝。