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

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

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


当前回答

switch语句的一个可能的缺点是它缺乏多个条件。您可以为if (else)设置多个条件,但不能在一个交换机中使用不同条件的多个case语句。

Switch语句不适用于简单布尔方程/表达式范围以外的逻辑运算。对于布尔方程/表达式,它非常适合,但不适用于其他逻辑运算。

在If语句中,您可以更自由地使用可用的逻辑,但如果If语句变得笨拙或处理不当,则可读性会受到影响。

两者都有自己的位置,这取决于你所面对的环境。

其他回答

SWITCH语句只在调试或兼容模式下产生与if相同的程序集。在发布版中,它将被编译成跳转表(通过MSIL 'switch'语句),即O(1)。

c#(不像许多其他语言)也允许打开字符串常量——这工作起来有点不同。为任意长度的字符串构建跳转表显然是不现实的,所以通常情况下,这样的切换将被编译成if堆栈。

但是如果条件的数量大到足以覆盖开销,c#编译器将创建一个HashTable对象,用字符串常量填充它,并在该表上进行查找,然后跳转。哈希表查找不是严格的O(1),并且有明显的常量代价,但是如果大小写标签的数量很大,它将比在if中比较每个字符串常量快得多。

总而言之,如果条件数量超过5个左右,则优先选择SWITCH而不是if,否则使用任何看起来更好的方法。

题外话,但我经常担心(更经常看到)if/else和switch语句用太多的情况变得太大。这些通常会损害可维护性。

常见的罪魁祸首包括:

在多个if语句中执行太多操作 案例陈述多得人类无法分析 if求值中的条件太多,以至于不知道要寻找什么

修复:

提取到方法重构。 使用带有方法指针的Dictionary而不是大小写,或者使用IoC来增加可配置性。方法工厂也很有帮助。 提取条件到自己的方法

在阅读了我面前所有的答案并浏览了所有的网页之后,我可以说switch case语句可以帮助您使您的代码看起来更整洁和易于管理。当我在我的项目中测试时,性能也比else if语句好,因为我必须检查超过10个用例(这可能听起来很奇怪!)

我刚刚注意到的是,你可以结合if/else和切换语句!在需要检查先决条件时非常有用。

if (string.IsNullOrEmpty(line))
{
    //skip empty lines
}
else switch (line.Substring(0,1))
{
    case "1":
        Console.WriteLine(line);
        break;
    case "9":
        Console.WriteLine(line);
        break;
    default:
        break;
}

我的意见。大多数情况下,如果性能不是标准,那么代码的可读性就更重要了。如果If /else语句的数量太多,则使用switch语句会更好。