关于C#:“switch”和嵌套“if”之间的确切区别是什么?


What is the exact difference between “switch” and nested “if”?

我不明白为什么在检查条件时需要使用switch语句而不是嵌套的if语句有任何速度


开关语句易于阅读,这对于维护很重要。另外,编译器可能可以用switch语句进行更好的优化,尽管编译器现在已经非常好了,所以可能不会。

从另一个角度看,在switch/case不能使用的情况下,可以使用多个if语句(嵌套或只是级联else-if)。比较字符串。


正如约翰所说,开关有特定的用途。它的功能是有限的,但是在这些限制范围内,它通常更容易理解,并且不太容易出现程序员错误,因为程序员仅限于交换机的功能。因此,当开关能够满足要求时,它通常是首选的。请注意,开关仅限于要比较的项目。

机器效率不太可能是一个考虑因素,但开发人员的效率可能是重要的。在开发由他人维护的软件时,软件所有者可能需要使用有助于提高开发人员整体效率的约定。


如果仔细查看switch控制流背后的文档,您将看到每种情况都是以break结束的。这意味着当满足开关盒的条件时,代码块停止执行。

在退出代码块之前,总是要检查if语句,因此速度是其背后的一个重要原因。我上面提到的任何东西都不是针对C语言或任何语言的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
switch(n) {
case 0:
   printf("You typed zero.
"
);
   break;
case 1:
case 9:
   printf("n is a perfect square
"
);
   break;
case 2:
   printf("n is an even number
"
);
   break;
case 3:
case 5:
case 7:
    printf("n is a prime number
"
);
    break;
case 4:
    printf("n is a perfect square
"
);
case 6:
case 8:
    printf("n is an even number
"
);
    break;
default:
   printf("Only single-digit numbers are allowed
"
);
   break;
   }

上面的代码说明,对于参数"n",如果n为0,则块将打印"You typed zero"(然后停止),如果n为1或9(然后停止),则块将打印"n是一个完美的正方形",依此类推。这与它的if控制流对应物不同,因为在if的情况下,在退出代码块之前,将针对每个条件检查参数。

通过在每个if语句后插入一个"break",可以使用if语句完成类似的功能。当您希望将参数与单个条件匹配,然后退出时,通常会对switch控制流提出上诉,而不是针对每个单个条件检查参数。