Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么c#编译器在switch构造中需要break语句?_C#_Syntax_Switch Statement_Break - Fatal编程技术网

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

为什么c#编译器在switch构造中需要break语句?,c#,syntax,switch-statement,break,C#,Syntax,Switch Statement,Break,我很难理解为什么编译器需要使用break语句。不可能错过它,因为现在允许失败。我看到C或C++中断的原因,但是这里需要。< /P> 为什么在案件结束后分手不是一种固有的行为?这不是一个没有语义的语法吗 对不起,如果这是个愚蠢的问题 编辑:仅当案例为空时才允许下拉列表。当有一个语句存在时,不能忽略break语句。所以,这是另一回事。c#中的break语句是语言创建者的设计决定……本质上,他们想要一个“明确的”break语句,一个只能以一种方式工作的break语句。简而言之,他们不想失败,如果他们只

我很难理解为什么编译器需要使用break语句。不可能错过它,因为现在允许失败。我看到C或C++中断的原因,但是这里需要。< /P> 为什么在案件结束后分手不是一种固有的行为?这不是一个没有语义的语法吗

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


编辑:仅当案例为空时才允许下拉列表。当有一个语句存在时,不能忽略break语句。所以,这是另一回事。

c#中的break语句是语言创建者的设计决定……本质上,他们想要一个“明确的”break语句,一个只能以一种方式工作的break语句。简而言之,他们不想失败,如果他们只是不包含“断言”而失败了,它就会破坏与C++的向后兼容性。

编译器不太需要“断言”语句,它需要它们。p>
这是一个设计决定。它在保持C语言和C++的语义上保持紧密的同时,消除了通过C语言的跌落陷阱,这一直是C语言的一个有争议的“特征”。

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

// 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
)方法中,然后从那里调用它

最后一点注意:空case Fallthrough是一个空case需要完成的全部工作,这就是为什么它是允许的。

如果case表达式为空,则允许Fallthrough:

case Foo:  // fallthrough allowed.
case Bar:
    Console.WriteLine ("Foo or Bar");
    break; // required
这是不允许的,这在同一联盟中是一个常见的误解,即“你不能在if条件下赋值”*



*你可以。规则是只允许在if条件中使用布尔值,并且
x=false
with
boolx
是一个布尔值。

可能只是为了让C小伙子/姑娘们在迁移到一种新语言时感到高兴。我同意你的观点,为什么要强制执行……我认为这是因为它不可避免地会被不太熟悉c,但熟悉c/c++语法的人阅读。有明确的中断有助于每个人的可读性,即使它没有任何用途。它是有效的向后兼容。PithC++ C++成员回答:“因为语言需要它。”DoBrz:帮助可读性是完全有效的目的。Fallthrough被允许使用“空的情况”OK,为什么这个行为不是内置的,而不需要在最后的情况下使用显式的断言语句。他们可以含蓄地这样做,对吧?他们想明确地说,不要失败。所需的
break
语句是一个声明,表明代码不会出错。@RobertHarvey:因为如果语句为空,则允许出错。@phresnel:从技术上讲,这不是出错;这只是在同一语句上的多个标签。@ RoBrthARVY:从技术上讲,如果我跳转到标签上,那么就进入下一个<代码> CASE <代码>标签,因为缺少<代码>破解< /代码>,我认为它会失败。更严格地说,失败仅仅是因为缺少跳转指令,例如,
break
。因此,它只是为了澄清,没有任何实际作用?@anthares:你可以这么说。中断可以很容易地由编译器插入,程序员在这里没有选择。但是“可读性”对于语言结构来说是一个重要的角色。@ThanosPapathanasiou:这毫无意义。消除中断不会使编译器对待开关有任何不同。Thanos,我也不相信这一点。编译器可以在任何需要的时候假设中断,并应用其他优化。@anthares:就个人而言,我认为正确的方法应该类似于C#使用
开关所采取的方法:图中程序员可能意味着10,也可能意味着12,编译器应该拒绝该代码,而不是假设这两种意思。如果一个编译器能够分辨出一个程序员可能有多种意图,那么在代码编译之前要求程序员消除歧义并不像让编译器接受一个不符合程序员意图的程序那么糟糕。事实上,问题是为什么语言设计师会抛出错误,而不是在完成后隐式地中断你的案例。但是“编译器不能假定丢失的中断是一个bug。”只是因为它是这样写的。由于不允许在非空情况下出现故障,问题在于编译器抛出错误的方式,而不是假定只有一种允许的行为。编译器不能假定丢失的中断是错误。据它所知,你真的想让这些案子落空。简单地假设每一个案例的结尾都应该有中断,就可以用一个bug换成另一个bug。你可以用
goto case
语句显式地“fall-through”:但这是不同的案例。它是将在案例结束前执行的指令。因此,它不会打乱我提出的逻辑——“如果到了案件的结尾,就中断”。