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

时间:2010-03-02 13:07:15

标签: c# syntax switch-statement break

我很难理解为什么编译器需要使用break语句。现在允许通过跌倒是不可能错过的。我看到了C或C ++中断的原因,但这里需要它。

为什么在案件结束后不会破坏内置行为?这不是一个没有语义的语法吗?

抱歉,如果这是一个愚蠢的问题。

编辑:只有在案件为空时才允许通过。当有声明时,你不能省略break语句。所以,这是另一回事。

4 个答案:

答案 0 :(得分:10)

编译器没有那么多“需要”break语句,它需要它们。

这是一个设计决策,与使用pass-by-reference参数调用方法时要求使用ref相比。

它保持代码在语义上接近于C和C ++,同时消除了C语言一直是值得商榷的“特性”的漏洞陷阱。

答案 1 :(得分:3)

c#中的break语句是语言创建者的一个设计决定......基本上他们想要一个“明确的”break语句,一个只能单向工作的break语句。简而言之,他们不想要堕落,如果他们刚刚防止掉线而不包括“中断”,那么它就会破坏与c ++的向后兼容性。

答案 2 :(得分:2)

如果case表达式为空,则

允许使用Fallthrough

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

不允许这是一个常见的误解,在同一个联盟中,“你不能在if条件中分配值” *


* 你可以。规则只是if条件中只允许布尔值,而x=false bool x; 是布尔值。

答案 3 :(得分:0)

通常这种代码是一个错误:

// 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");

}

但是,编译器不能假设丢失的中断是一个bug。据他所知,你确实希望案件能够落实。

简单地假设休息时间应该在每个案例的结尾处,只会针对不同的bug交换一个bug。

所以,相反,语言设计者不允许非空案例掉线,如果省略它们就会抛出错误。

如果您需要在非空案例之间共享代码,请将其放在private(可能是static)方法中并从那里调用它。

最后一个注意事项:空案件通过是一个空案件预计会做的,这就是为什么允许这样做。