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

Dan*_*7el 7 c# performance

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

一:

string value = "ALPHA";

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

二:

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;
}
Run Code Online (Sandbox Code Playgroud)

就个人而言,我更喜欢下面的选项TWO,但除了基本的风格原因之外我没有任何其他真正的理由.但是,我甚至不确定是否存在风格原因.感谢您的输入.

JSB*_*ոգչ 9

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

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


Jef*_*ser 4

选项 #1 更快,因为如果您查看Enum.Parse的代码,您会发现它会逐项遍历每个项目,寻找匹配项。此外,需要维护和保持一致性的代码也更少。

需要注意的是,由于土耳其测试问题,您不应该使用ToUpper,而应该使用ToUpperInvariant()

如果您坚持使用选项#2,至少使用允许您指定忽略大小写的重载。这比您自己转换为大写要快。此外,请注意,框架设计指南鼓励所有枚举值均采用 PascalCase,而不是 SCREAMING_CAPS。

  • 说真的,SCREAMING_CAPS 太C++了 (2认同)