2009-12-22 138 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可能会使第二种解决方案变得更慢,但不会相对较慢。

在中间的某个地方,我预计比较字符串的成本高于比较枚举会使第一个解决方案更快。

如果在不同的编译器版本或不同的选项上有所不同,我甚至不会感到惊讶。