在c#中使用switch语句和if/else语句的优缺点是什么?除了代码的外观,我无法想象有这么大的区别。

是否有任何原因导致最终的IL或相关的运行时性能会有根本的不同?

相关:什么是更快,开关上字符串或elseif上类型?


当前回答

我的计算机教授建议你不要切换语句,因为人们经常忘记断点或错误地使用它。我记不清他到底说了什么,但沿着这条线看了一些开创性的代码库,其中显示了switch语句的例子(几年前),其中也有大量的错误。

其他回答

如果你只使用If或else语句基解使用比较?操作符

(value == value1) ? (type1)do this : (type1)or do this;

你可以在开关中执行或程序

switch(typeCode)
{
   case TypeCode:Int32:
   case TypeCode.Int64:
     //dosomething here
     break;
   default: return;
}

一般来说(考虑到所有语言和所有编译器),switch语句有时可能比if / else语句更有效,因为编译器很容易从switch语句生成跳转表。如果有适当的约束,也可以对if / else语句做同样的事情,但这要困难得多。

在c#的情况下,这也是正确的,但出于其他原因。

对于大量字符串,使用switch语句具有显著的性能优势,因为编译器将使用哈希表来实现跳转。

使用少量的字符串,两者之间的性能是相同的。

这是因为在这种情况下,c#编译器不会生成跳转表。相反,它生成等效于IF / ELSE块的MSIL。

有一个“switch statement”MSIL指令,当被触发时将使用一个跳转表来实现一个switch语句。但是,它只适用于整数类型(这个问题询问的是字符串)。

对于少量的字符串,编译器生成IF / ELSE块比使用哈希表更有效。

当我最初注意到这一点时,我做了一个假设,因为IF / ELSE块用于少量字符串,编译器对大量字符串做了相同的转换。

这是错误的。“IMA”好心地向我指出了这一点(嗯……他不怎么客气,但他是对的,我错了,这是最重要的部分)

我还对MSIL中缺少“switch”指令做了一个愚蠢的假设(我想,如果有一个switch原语,为什么他们不把它与哈希表一起使用,所以一定没有一个switch原语....). 这是错误的,而且我非常愚蠢。IMA再次向我指出了这一点。

我在这里更新是因为这是评分最高的帖子,也是公认的答案。

然而,我把它变成了社区维基,因为我认为我不应该因为犯错而获得REP。如果你有机会,请给ima的帖子投票。

我认为Switch比If条件更快 看看是否有这样一个程序:

写一个程序,输入任意数字(1- 99之间),并检查它在哪个槽a) 1- 9,然后槽1 b) 11 - 19,然后槽2 c) 21-29,然后槽3,直到89-99

然后,如果你有许多条件,但儿子切换情况下,你必须只是类型

开关(no /10) case 0 = 1-9,case 1 = 11-19,以此类推

这将是如此简单

还有很多这样的例子!

编译器将把几乎所有内容都优化为相同的代码,只有微小的差异(Knuth,任何人?)

区别在于一个switch语句比串在一起的15个if else语句更简洁。

朋友不会让朋友叠加if-else语句。

我的计算机教授建议你不要切换语句,因为人们经常忘记断点或错误地使用它。我记不清他到底说了什么,但沿着这条线看了一些开创性的代码库,其中显示了switch语句的例子(几年前),其中也有大量的错误。