为什么c#编译器要求在switch构造中使用break语句?

问题描述 投票:13回答:4

我很不理解,为什么编译器要求使用break语句。因为现在允许掉过头来,所以不可能漏掉它。我明白在C或C++中使用break语句的原因,但这里是否需要。

为什么在一个case结束后不使用break语句呢?这不就是一个没有语义的语法吗?

对不起,如果这是一个愚蠢的问题。

EDIT:只有当case是空的时候才允许掉过。当那里有语句的时候,你不能省略断句。所以,这是另一回事。

c# syntax switch-statement break
4个回答
10
投票

编译器并不是 "需要 "break语句,而是需要它们。

这是一个设计决定。它使代码在语义上保持了与C和C++的接近,同时消除了掉线的隐患,而掉线一直是C语言的一个值得商榷的 "特征"。


3
投票

c#中的break语句是该语言的创造者们的一个设计决定......本质上,他们想要一个 "毫不含糊 "的break语句,一个只能用一种方式工作的break语句。 简而言之,他们不希望出现跌穿,如果他们只防止跌穿而不包含 "break",就会破坏与c++的向后兼容性。


2
投票

跌穿 如果case表达式为空,则允许使用。

case Foo:  // fallthrough allowed.
case Bar:
    Console.WriteLine ("Foo or Bar");
    break; // required

这是不允许的,这是一个常见的误解,就像 "你不能在if条件中赋值 "一样。*


* 你可以这样做。规则只是在if-条件中只允许使用布尔值,而 x=falsebool x; 一个布尔值。


0
投票

通常这种代码是一个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)方法,然后从那里调用它。

最后一个说明:空壳落空就是一个空壳要做的所有事情,这就是为什么它被允许的原因。

© www.soinside.com 2019 - 2024. All rights reserved.