在c#中使用switch语句和if/else语句的优缺点是什么?除了代码的外观,我无法想象有这么大的区别。
是否有任何原因导致最终的IL或相关的运行时性能会有根本的不同?
相关:什么是更快,开关上字符串或elseif上类型?
在c#中使用switch语句和if/else语句的优缺点是什么?除了代码的外观,我无法想象有这么大的区别。
是否有任何原因导致最终的IL或相关的运行时性能会有根本的不同?
相关:什么是更快,开关上字符串或elseif上类型?
当前回答
题外话,但我经常担心(更经常看到)if/else和switch语句用太多的情况变得太大。这些通常会损害可维护性。
常见的罪魁祸首包括:
在多个if语句中执行太多操作 案例陈述多得人类无法分析 if求值中的条件太多,以至于不知道要寻找什么
修复:
提取到方法重构。 使用带有方法指针的Dictionary而不是大小写,或者使用IoC来增加可配置性。方法工厂也很有帮助。 提取条件到自己的方法
其他回答
如果你只使用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)设置多个条件,但不能在一个交换机中使用不同条件的多个case语句。
Switch语句不适用于简单布尔方程/表达式范围以外的逻辑运算。对于布尔方程/表达式,它非常适合,但不适用于其他逻辑运算。
在If语句中,您可以更自由地使用可用的逻辑,但如果If语句变得笨拙或处理不当,则可读性会受到影响。
两者都有自己的位置,这取决于你所面对的环境。
感兴趣的问题。这是几周前在工作中遇到的问题,我们通过编写一个示例片段并在.NET Reflector中查看它找到了答案(Reflector太棒了!!我喜欢它)。
这是我们的发现: 对于字符串以外的任何对象,有效的switch语句将作为switch语句编译到IL。然而,如果它是一个字符串,它在IL中被重写为IF /else IF /else。所以在我们的例子中,我们想知道switch语句如何比较字符串,例如区分大小写等,reflector很快给了我们一个答案。知道这一点很有用。
如果你想对字符串进行区分大小写的比较,那么你可以使用switch语句,因为它比执行String更快。用if/else进行比较。(编辑:阅读哪个更快,打开字符串还是打开类型?然而,如果你想做一个不区分大小写的,那么最好使用if/else,因为结果代码不漂亮。
switch (myString.ToLower())
{
// not a good solution
}
最好的经验法则是使用switch语句,如果它是有意义的(认真的),例如:
它提高了代码的可读性 您正在比较一个值范围(float, int)或enum
如果您需要操作将值送入switch语句(创建一个用于切换的临时变量),那么您可能应该使用If /else控制语句。
更新:
实际上更好的方法是将字符串转换为大写(例如ToUpper()),因为与ToLower()相比,即时编译器可以做进一步的优化。这是一个微观优化,但在一个紧密的循环中,它可能是有用的。
补充一点:
为了提高switch语句的可读性,可以尝试以下方法:
把最有可能的分支放在前面,即访问最多的分支 如果它们都可能发生,按字母顺序列出,这样更容易找到它们。 永远不要对剩下的最后一个条件使用默认的catch-all,这是懒惰的,并且会在以后的代码生命周期中导致问题。 使用默认的catch-all来断言一个未知的条件,即使它几乎不可能发生。这就是断言的好处。
我的意见。大多数情况下,如果性能不是标准,那么代码的可读性就更重要了。如果If /else语句的数量太多,则使用switch语句会更好。
实际上,switch语句更有效。编译器会将其优化为一个查找表,而使用if/else语句则不行。缺点是switch语句不能与变量值一起使用。
你不能:
switch(variable)
{
case someVariable:
break;
default:
break;
}
它必须是:
switch(variable)
{
case CONSTANT_VALUE:
break;
default:
break;
}