在c#中使用switch语句和if/else语句的优缺点是什么?除了代码的外观,我无法想象有这么大的区别。
是否有任何原因导致最终的IL或相关的运行时性能会有根本的不同?
相关:什么是更快,开关上字符串或elseif上类型?
在c#中使用switch语句和if/else语句的优缺点是什么?除了代码的外观,我无法想象有这么大的区别。
是否有任何原因导致最终的IL或相关的运行时性能会有根本的不同?
相关:什么是更快,开关上字符串或elseif上类型?
当前回答
如果你只使用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语句不能与变量值一起使用。
你不能:
switch(variable)
{
case someVariable:
break;
default:
break;
}
它必须是:
switch(variable)
{
case CONSTANT_VALUE:
break;
default:
break;
}
这实际上并没有回答您的问题,但考虑到编译版本之间的差异很小,我建议您以最能描述您的意图的方式编写代码。这样编译器不仅有更好的机会执行您所期望的操作,而且还会使其他人更容易维护您的代码。
如果您的意图是基于一个变量/属性的值来分支您的程序,那么switch语句最好地代表了这一意图。
如果你的意图是基于不同的变量/属性/条件来分支你的程序,那么If /else If链最能代表这个意图。
我承认cody在人们忘记break命令方面是正确的,但我几乎经常看到人们在犯{}错误的地方执行复杂的if块,因此应该在条件语句中的行却没有。这是我总是在if语句中包含{}的原因之一,即使其中只有一行。它不仅更容易阅读,而且如果我需要在条件语句中添加另一行,我也不会忘记添加它。
有三个理由支持这种转变:
A compiler targeting native code can often compile a switch statement into one conditional branch plus an indirect jump whereas a sequence of ifs requires a sequence of conditional branches. Depending on the density of cases a great many learned papers have been written about how to compile case statements efficiently; some are linked from the lcc compiler page. (Lcc had one of the more innovative compilers for switches.) A switch statement is a choice among mutually exclusive alternatives and the switch syntax makes this control flow more transparent to the programmer then a nest of if-then-else statements. In some languages, including definitely ML and Haskell, the compiler checks to see if you have left out any cases. I view this feature as one of the major advantages of ML and Haskell. I don't know if C# can do this.
一个趣闻:在托尼·霍尔接受终身成就奖的演讲中,我听到他说,在他职业生涯中所做的所有事情中,有三件事是他最自豪的:
发明快速排序 发明switch语句(Tony称之为case语句) 开始和结束他的工业生涯
我无法想象没有开关的生活。
题外话,但我经常担心(更经常看到)if/else和switch语句用太多的情况变得太大。这些通常会损害可维护性。
常见的罪魁祸首包括:
在多个if语句中执行太多操作 案例陈述多得人类无法分析 if求值中的条件太多,以至于不知道要寻找什么
修复:
提取到方法重构。 使用带有方法指针的Dictionary而不是大小写,或者使用IoC来增加可配置性。方法工厂也很有帮助。 提取条件到自己的方法
通常它看起来会更好——也就是更容易理解发生了什么。考虑到性能上的好处最少,代码的视图是最重要的区别。
因此,如果if/else看起来更好,就使用它,否则使用switch语句。