我很不理解,为什么编译器要求使用break语句。因为现在允许掉过头来,所以不可能漏掉它。我明白在C或C++中使用break语句的原因,但这里是否需要。
为什么在一个case结束后不使用break语句呢?这不就是一个没有语义的语法吗?
对不起,如果这是一个愚蠢的问题。
EDIT:只有当case是空的时候才允许掉过。当那里有语句的时候,你不能省略断句。所以,这是另一回事。
编译器并不是 "需要 "break语句,而是需要它们。
这是一个设计决定。它使代码在语义上保持了与C和C++的接近,同时消除了掉线的隐患,而掉线一直是C语言的一个值得商榷的 "特征"。
c#中的break语句是该语言的创造者们的一个设计决定......本质上,他们想要一个 "毫不含糊 "的break语句,一个只能用一种方式工作的break语句。 简而言之,他们不希望出现跌穿,如果他们只防止跌穿而不包含 "break",就会破坏与c++的向后兼容性。
跌穿 是 如果case表达式为空,则允许使用。
case 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");
}
但是,编译器不能认为缺失的断点是个错误 据它所知,你确实希望这些case能够通过。
简单地假设断点应该在每个case的结尾,只会用一个bug换取另一个bug。
所以,语言设计者反而不允许非空例的跌穿,如果你省略了它们,就会抛出一个错误。
如果你需要非空例之间共享代码,就把它放在一个 private
(可能是 static
)方法,然后从那里调用它。
最后一个说明:空壳落空就是一个空壳要做的所有事情,这就是为什么它被允许的原因。