我对样式和性能方面的考虑都很感兴趣。我的选择是执行以下任一操作(抱歉格式不佳,但此网站的界面不是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,但除了基本的风格原因之外我没有任何其他真正的理由。但是,我甚至不确定是否存在风格原因。感谢您的投入。
答案 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字符串。