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

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

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


当前回答

这实际上并没有回答您的问题,但考虑到编译版本之间的差异很小,我建议您以最能描述您的意图的方式编写代码。这样编译器不仅有更好的机会执行您所期望的操作,而且还会使其他人更容易维护您的代码。

如果您的意图是基于一个变量/属性的值来分支您的程序,那么switch语句最好地代表了这一意图。

如果你的意图是基于不同的变量/属性/条件来分支你的程序,那么If /else If链最能代表这个意图。

我承认cody在人们忘记break命令方面是正确的,但我几乎经常看到人们在犯{}错误的地方执行复杂的if块,因此应该在条件语句中的行却没有。这是我总是在if语句中包含{}的原因之一,即使其中只有一行。它不仅更容易阅读,而且如果我需要在条件语句中添加另一行,我也不会忘记添加它。

其他回答

这实际上并没有回答您的问题,但考虑到编译版本之间的差异很小,我建议您以最能描述您的意图的方式编写代码。这样编译器不仅有更好的机会执行您所期望的操作,而且还会使其他人更容易维护您的代码。

如果您的意图是基于一个变量/属性的值来分支您的程序,那么switch语句最好地代表了这一意图。

如果你的意图是基于不同的变量/属性/条件来分支你的程序,那么If /else If链最能代表这个意图。

我承认cody在人们忘记break命令方面是正确的,但我几乎经常看到人们在犯{}错误的地方执行复杂的if块,因此应该在条件语句中的行却没有。这是我总是在if语句中包含{}的原因之一,即使其中只有一行。它不仅更容易阅读,而且如果我需要在条件语句中添加另一行,我也不会忘记添加它。

根据这个链接,使用Switch和IF语句的迭代测试的IF和Switch比较,就像对于1,000,000,000次迭代,Switch语句花费的时间= 44.3秒,IF语句花费的时间= 48.0秒

也就是每秒20833333次迭代,所以,我们真的需要更专注吗,

附注:只是为了了解在少量条件下的性能差异。

实际上,switch语句更有效。编译器会将其优化为一个查找表,而使用if/else语句则不行。缺点是switch语句不能与变量值一起使用。

你不能:

switch(variable)
{
   case someVariable:
   break;
   default:
   break;
}

它必须是:

switch(variable)
{
  case CONSTANT_VALUE:
  break;
  default:
  break;
}

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

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

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

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

我认为,不只是c#,而是所有基于C的语言:因为切换仅限于常量,所以使用“跳转表”可以生成非常高效的代码。C用例实际上是一个很好的老式FORTRAN计算GOTO,但c#用例仍然是针对常量进行测试。

优化器不可能生成相同的代码。考虑,例如,

if(a == 3){ //...
} else if (a == 5 || a == 7){ //...
} else {//...
}

因为这些是复合布尔值,生成的代码必须计算一个值,然后短路。现在考虑一下

switch(a){
   case 3: // ...
    break;
   case 5:
   case 7: //...
    break;
   default: //...
}

这可以编译成

BTABL: *
B3:   addr of 3 code
B5:
B7:   addr of 5,7 code
      load 0,1 ino reg X based on value
      jump indirect through BTABL+x

因为你隐式地告诉编译器它不需要计算OR和相等测试。