开关似乎没那么无用,因为它们可以用if-else语句替换,它可以做的不仅仅是匹配一个char / int / enum等。我只能想到一个很好用于交换机,那就是用于解释命令行参数。
switch语句有哪些实际用途?
答案 0 :(得分:27)
在某些情况下,交换机更易读并且派上用场。通常在您对选项进行分组时。
以下是其中之一:
int numDays = 0;
int month = 2;
int year = 2010;
// find the number of days in the month
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
numDays = 31;
break;
case 4:
case 6:
case 9:
case 11:
numDays = 30;
break;
case 2:
if ( ((year % 4 == 0) && !(year % 100 == 0))
|| (year % 400 == 0) )
numDays = 29;
else
numDays = 28;
break;
default:
System.out.println("Invalid month.");
break;
}
答案 1 :(得分:25)
在我看来,使用switch vs if / else有两个原因:
答案 2 :(得分:18)
你需要记住,开关更容易维护 - 一大堆嵌套的ifs和elses很快就会变得很难维护。
开关可以更容易地插入新案例。
答案 3 :(得分:9)
当我使用枚举来指示我的方法应采取的操作时,我使用开关。当行动互相排斥时,它会有所帮助。
答案 4 :(得分:7)
对于某些上下文,开关针对多种语言进行了优化。通常在可能的情况下,他们会创建跳转表甚至哈希表。实际上,当可能使用交换机时,使用if / else可能会比(逻辑上)相同的代码执行得更好。
答案 5 :(得分:4)
有很多情况,我们必须处理的很多情况是,如果你有很多选项,语法会有点压缩,有时比if / then语法更容易阅读。< / p>
尽管可以采用任何一种方式进行论证,但我发现在多个选项的情况下,开关更易于阅读,维护和理解。我也在工厂模式类型的情况下使用它,这有助于记录。
答案 6 :(得分:4)
如果我将多个值的相同变量进行比较,我总是使用开关 - 与长if-elseif链相比,开关编码(并且更容易维护)要快得多。想象一下,更改变量名称,使用开关它将是一个单独的编辑,if-elseif链将是几个。
此外,根据您选择的语言,您可以使用案例属于“功能”,与if-elseif链一样,您最终会得到重复的代码。
答案 7 :(得分:3)
Switch语句非常适合编写有限状态机Click here to learn more about them
答案 8 :(得分:2)
你可以从switch语句中删除中断。这样你就可以拥有:
CASE_A:
...
BASE_B
...
这样你就可以让case_a结合它下面的所有其他情况,直到它遇到中断。只用ifs就不那么好了。
答案 9 :(得分:2)
这是使用该语言的正确方法。它允许编译器进行一些优化,并使不是你的人更容易阅读代码。
此外,在某些语言中,您可以切换枚举,如果您错过了值,编译器会发出警告(我认为)。
答案 10 :(得分:2)
有几点:
答案 11 :(得分:2)
Duff's Device。它在现代的用处是值得商榷的,但它的精彩并非如此。
答案 12 :(得分:2)
对于Perl,使用switch statement可以显着降低代码的复杂性。
只是比较这两个例子。
使用given
/when
:
use feature qw'switch';
my $num_days;
given( $month) {
when( [ 1,3,5,7,8,10,12 ] ){ $num_days = 31 }
when( [ 4,6,9,11 ] ){ $num_days = 30 }
when( 2 ){
$num_days = 29;
$num_days = 28 if $year % 4;
$num_days = 28 unless $year % 100;
$num_days = 29 unless $year % 400;
default{ print "Invalid month.\n" }
}
使用for
替代新的~~
(smart-match)运营商。
my $num_days;
for( 1,3,5,7,8,10,12 ){
if( $month == $_ ){
$num_days = 31;
last;
}
}
for( 4,6,9,11 ){
if( $month == $_ ){
$num_days = 30;
last;
}
}
if( $month == 2 ){
$num_days = 29;
$num_days = 28 if $year % 4;
$num_days = 28 unless $year % 100;
$num_days = 29 unless $year % 400;
}
unless( defined $num_days ){
print "Invalid month.\n"
}
答案 13 :(得分:2)
在我看来,交换机的主要优点在于它使读者立即明白所有选项都依赖于同一个变量。你当然可以编写一个if / elseif / elseif块来完成同样的事情,但是读者必须仔细检查它确实是每次测试的同一个变量。
还有一个噩梦般的维护场景,你在同一个变量上有一个很长的if / elseif,有人决定更改变量名,所以他改变了所有的if ...除了他错过了一个。
正如其他人所指出的,还有一个事实是编译器通常可以更好地优化它。
答案 14 :(得分:1)
它有助于提高可读性 - 一目了然,我知道应该运行哪个代码块的决定是基于同一个变量的不同值。
答案 15 :(得分:0)
可能可能更容易让编译器将switch语句转换为分派表,而不是将等效的if / else汤转换为分派表。如果(并且仅当)这是真的,那么你应该对相关代码进行O(1)调度,而不是O(log n)(或O(n),如果if / else汤写得不好)。
在某些(尽管不是全部)情况下,使用开关检查您是否已经覆盖了必要的测试,而不是使用if / else的方法。
答案 16 :(得分:0)
在大多数情况下,我更喜欢使用地图来切换。
if (actionMap.contains(choice)) {
Action a = actionMap.get(choice);
a.execute();
} else {
//do something else
}
但是如果选择太复杂而无法转换为地图,或者可能采取多项措施,那么转换效果会更好。
switch (choice) {
case 1: actionOne(); break;
case 2: if(actionOne()) {actionTwo()}; break;
case 3: if(!actionOne() && (actionTwo() > 1)) {actionThree()}; result = 7;break;
default: result = actionTwo();
}
遗憾的是,有时需求很复杂。在嵌套if / else constrcts的简化版本的情况下,Switch非常有用。
答案 17 :(得分:0)
不要问python程序员这个问题,因为该语言没有switch语句,而是鼓励使用字典。
要回答你的问题,我可以想一下switch语句有用的一种情况。 当语言/编译器/静态分析器确保您检查所有情况时,它很有用。这适用于枚举。
如果您在枚举中添加了另一个项目,现在可以在所有正在切换这种枚举的地方收到警告,告诉您错过了一个案例。