我很难理解为什么编译器要求使用break语句。由于现在不允许出现“穿透”,因此不可能错过它。我明白在C或C++中需要break的原因,但这里是否也需要呢?
为什么在case结束后没有内建的行为来进行break呢?这不只是一种没有实际意义的语法吗?
如果这是一个愚蠢的问题,请原谅。
编辑:只有当case为空时才允许“穿透”。当有语句时,您不能省略break语句。所以,这是一个不同的问题。
我很难理解为什么编译器要求使用break语句。由于现在不允许出现“穿透”,因此不可能错过它。我明白在C或C++中需要break的原因,但这里是否也需要呢?
为什么在case结束后没有内建的行为来进行break呢?这不只是一种没有实际意义的语法吗?
如果这是一个愚蠢的问题,请原谅。
编辑:只有当case为空时才允许“穿透”。当有语句时,您不能省略break语句。所以,这是一个不同的问题。
编译器不仅是“需要”break语句,它必须要求它们。
这是一项设计决策。它使代码在语义上更接近C和C++,同时消除了C语言中始终存在的可争议的“穿透”陷阱。
switch
/break
所采取的方法:考虑到程序员可能是想表示10或者12,编译器应该拒绝代码而不是假设任意一种含义。如果编译器能够区分程序员可能想要表示的多个含义,要求程序员在编译代码之前进行歧义消除并不像让编译器接受程序员意图不明的程序那样糟糕。 - supercatbreak
语句是一个声明,表明代码不会掉落。 - Robert Harveycase
-label,我会认为这是穿透。更具体地说,穿透只是跳转指令(例如break
)的缺失。 - Sebastian Machcase Foo: // fallthrough allowed.
case Bar:
Console.WriteLine ("Foo or Bar");
break; // required
“不允许这样做”是一个常见的误解,和“你不能在if条件中赋值”一样。
*实际上你可以这样做。规则只是if条件中只允许布尔值,而x=false
与bool x;
是一个布尔值。
通常这种代码都是个 bug:
// Contrived calculator demostration
decimal x = 5m;
decimal y = 10m;
decimal result = 0m;
string blah = "Divide";
// .. other code omitted
switch(blah) {
case "Divide":
result = x / y;
case "Multiply":
result = x * y;
case "Add":
result = x + y;
case "Subtract":
result = x - y;
default:
MessageBox.Show("Not a valid operation");
}
然而,编译器不能假设缺少的break是一个错误。就它所知道的而言,你确实希望这些case语句穿透下去。
简单地假设每个case都应该在结尾处加上break只会将一个错误换成另一个错误。
因此,语言设计者禁止了非空case语句的穿透,并在省略它们时抛出错误。
如果需要在非空case之间共享代码,请将其放入一个private
(可能是static
)方法中,并从那里调用它。
最后一点说明:空case语句的唯一预期行为就是穿透,这也是为什么允许它们存在的原因。
goto case
语句显式地“穿透”:http://msdn.microsoft.com/zh-cn/library/13940fs2.aspx - Sam Harwell