.NET C#switch语句字符串比较与枚举比较

时间:2009-12-22 16:50:32

标签: c# performance

我对样式和性能方面的考虑都很感兴趣。我的选择是执行以下任一操作(抱歉格式不佳,但此网站的界面不是WYSIWYG):

一:

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,但除了基本的风格原因之外我没有任何其他真正的理由。但是,我甚至不确定是否存在风格原因。感谢您的投入。

6 个答案:

答案 0 :(得分:9)

第二个选项略快,因为第一个选项可能需要完整的字符串比较。但是,在大多数情况下,差异太小而无法衡量。

第二个选项的真正优势在于您明确表示value的有效值属于狭窄范围。实际上,如果字符串值不在预期范围内,它将在Enum.Parse处抛出异常,这通常正是您想要的。

答案 1 :(得分:4)

选项#1速度更快,因为look at the code如果Enum.Parse,您会看到它逐个浏览每个项目,寻找匹配项。此外,维护和保持一致的代码较少。

需要注意的一点是,由于ToUpper问题,您不应使用ToUpperInvariant(),而应使用Turkey Test

如果你坚持选项#2,至少要使用允许你指定忽略大小写的重载。这比自己转换为大写更快。另外,请注意Framework Design Guidelines鼓励所有枚举值都是PascalCase而不是SCREAMING_CAPS。

答案 2 :(得分:2)

我无法评论问题的性能部分,但至于样式我更喜欢选项#2。每当我有一组已知值并且该集合相当小(少于几十个)时,我更喜欢使用枚举。我发现枚举比字符串值的集合更容易使用,任何查看代码的人都可以快速查看允许值的集合。

答案 3 :(得分:2)

这实际上取决于枚举中的项目数量,您必须针对每个特定场景测试它 - 而不是它可能会产生很大的不同。但这是一个很好的问题。

使用很少的值,在任何一个例子中,Enum.Parse将比其他任何东西花费更多的时间,所以第二个应该更慢。

如果有足够的值,switch语句将被实现为一个哈希表,它应该与字符串和枚举的速度相同,所以再次,Enum.Parse可能会使第二个解决方案变慢,但不会相对较多。 / p>

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

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

答案 4 :(得分:1)

我肯定会说#1。 Enum.Parse()导致相对昂贵的反射。另外,如果没有定义,Enum.Parse()会抛出异常,因为没有TryParse()你需要将它包装在Try / Catch块中

答案 5 :(得分:0)

在打开字符串值与枚举时不确定是否存在性能差异。

要考虑的一件事是,您需要在代码中的其他位置使用用于case语句的值。如果是这样,那么使用枚举会更有意义,因为你有一个单一的值定义。也可以使用Const字符串。