gpt4 book ai didi

c# - 为什么不对 switch 语句强制执行显式 fall-through 而不是显式 break?

转载 作者:太空狗 更新时间:2023-10-30 00:44:47 24 4
gpt4 key购买 nike

这不是一个特定的 C# 问题,而是 switch 的 C# 版本让我问了这个问题。

为什么我必须明确声明我不想从一个 case 语句跳转到下一个,而不是指示我何时想跳槽?

在 C# 中,编译器不会让您从一个 case 语句跳到下一个(除非 case 语句为空),但它会强制您输入每个代码末尾都有一个明确的 break。我编写的绝大多数 switch 语句都没有落空。

int x = 4;
string result;

switch (x)
{
case 1:
result = "One";
break;
case 2:
result = "A couple";
break;
case 3:
case 4:
result = "Three or four";
break;
/*
case 5:
result = "Five"; // Here be an error! A common typo for me!!!
*/
default:
result = "Five or more";
break;
}

上面的例子是为了展示可能性而设计的。我实际失败的次数(比如上面的 3 到 4 次)很少。如果我从上面的案例 5 中删除注释,C# 编译器会将其捕获为错误。如果编译器完全知道我要做什么,为什么我必须手动修复它?

下面的不是更好吗?

int x = 4;
string result;

switch (x)
{
case 1:
result = "One";
case 2:
result = "A couple";
case 3:
continue; // or even goto 4
case 4:
result = "Three or four";
/*
case 5:
result = "Five"; // This would not longer be an error!! Hooray!
*/
default:
result = "Five or more";
}

让我明确一点,我并不是在提倡失败。在每个 case 语句的末尾都有一个隐含的 break。这两个示例在功能上是等效的。

如果我忘记了案例 3​​ 中的 continue 语句,编译器仍然会对我大吼大叫。不过这种情况不会经常发生,我很乐意提供帮助。事实上,在这种情况下,我错过填写骨架代码的可能性非常高。有用。告诉我我忘记了 break 语句是没有用的。让编译器开心只是更忙的工作。

看起来这可能只是 C 的保留(即使在 case 语句中有代码,它也允许你失败)。是否有更深层次的原因我没有看到?

今天早上我正在查看一些编译器代码,在 switch 中有数百个 case 语句,除了返回操作码外什么也没做。他们每个人都有一个 break 语句。太多的打字和困惑......

人们怎么想?为什么第二个选项不是更好的默认值?

最佳答案

C# switch 语句的基本原理是,C 的行为是 case 失败,除非你用 break, return 这样的语句显式退出,或 goto。这意味着每个熟悉 C 的人(可能是大多数 C# 程序员)都会期望 C# switch 语法的含义大致相同。如果 C# 设计者让案例失败,代码将做与用户期望完全相反的事情!

另一方面,错误的常见来源是人们忘记了案例末尾的 break 语句,导致控制落入了不应该的位置。一个不太常见的问题是人们会重新排序案例,使得过去(不需要 break)的案例不再在末尾(并且意外掉线) .

换句话说,让案例失败会导致那些期望它失败的人的错误,但不要求明确终止案例会导致忘记放的人的错误在 break 中。因此,案例不会失败,但仍然需要 break

关于c# - 为什么不对 switch 语句强制执行显式 fall-through 而不是显式 break?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6990245/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com