为什么要放在switch语句的最后一个标签之后呢?编译器肯定知道它是switch语句的最后一个标签吗?在switch的最终case语句之后休息是很好的防御性编程。如果将来可能在下面添加另一个case语句,这将消除上述case中程序流丢失的风险。这是因为在C++中会发生以下情况:switch(a){case1://dostuffcase2://dootherstuff}如果a为1,则-根据C++规则-“dostuff”和“dosomethingelse””两者都会发生。因此,C#要求您明确指定是要中断还是传递不同的标签,而不是让C++程序员进入C#(并使代码更清晰)。现在,至于为什么需要中断最后一个块,这是一个简单的一致性问题。它也使重构更容易:如果你移动案例,你不会因为缺少break语句而突然出现错误。此外,当你想添加其他标签等时会发生什么。一致性.在花括号对象实例化语句中的最后一个枚举定义或最后一个赋值之后能够使用逗号的原因相同。最后一个案例可能并不总是最后一个案例。它也减少了特殊情况。如果是这种情况,它更容易学习、编写或阅读。尽管这增加了一致性。在C#switch语句中,您必须明确声明要中断或转到另一个案例或转到默认值。在C和C++中,switch语句没有中断标记。在C#中让用户明确说出他们想要做什么以避免错误是很重要的。例如,许多用户是从C++转到C#的。关于最后一个案例陈述,尤其是你问的问题。我可以想到3个很好的理由。任何语言的一致性都非常重要。如果稍后追加另一个案例,默认值应该做什么?为什么要打破默认?为什么不去?这里有歧义。根据http://msdn.microsoft.com/en-us/library/06tc147t.aspx你不能“通过”任何开关部分,包括最后一个。可以通过以下任何方式避免掉头:break、goto或return。实际上有一种情况你不需要休息考虑下面的代码:usingSystem;公共类程序{publicstaticvoidDoStuff(){}publicstaticvoidDoAnotherStuff(){}publicstaticvoidMain(){switch(1){case1:DoStuff();休息;默认值:DoAnotherStuff();使用C#4.0编译器它只会给你一个很好的CS0162:Unreachablecodewarning似乎因为switch有一个常量表达式,编译器已经知道它要执行的路径,然后忽略dafault标签.很酷的是,如果您将switch(1)更改为switch(2),它将不再编译,因为默认标签缺少它的中断。编辑:从C#参考中,C#中的要求是每个开关部分的末尾,包括最后一个,是不可到达的。虽然通常使用跳转语句可以满足此要求,但以下内容也是有效的,因为无法到达语句列表的末尾。案例4:while(true)Console.WriteLine("无限循环......");这解释了为什么默认情况下不需要休息。事实上,任何不可缓存的选项卡都不需要break,也不需要return或go来使用switch,break不是唯一的选择。您还可以选择转到另一个案例、转到默认案例、转到另一个选项卡或返回。一个实现主体也可以有多个案例。由于最多有五个选项,并且能够为一个实现提供多个案例,编译器不能简单地输入“正确”答案。你必须选择你想做什么。它确保编译器做正确的事情,使您的代码更清晰,并使程序员更难做愚蠢的事情,例如在“最后”之后添加另一个案例并忘记输入break/goto/return。根据EricLippert的博客文章(案例2),它允许您任意重新排序开关部分而不会意外引入重大更改:它[编译器]要求每个开关部分(包括最后一个开关部分)是无法到达的端点。这条规则的目的,以及一般无法通过的规则,是我们希望您能够随意重新排序开关部件,而不会意外地引入重大变化。如上所述,您可以使用default:,但也可以考虑null。casenull:需要休息;casenull:iEvaluatedToNothing();休息;如果你想“瀑布”,你可以这样做;switch(deliverMail){casenull:case"":case"Address0":deliverMail0();转到案例“1”;案例“1”:deliverMail1();休息;您可以随意使用它,但在最后一次评估时需要一个。以上就是C#学习教程:为什么要放在switch语句的最后一个标签之后呢?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
