这不是专门的 C# 问题,而是 C# 版本switch
让我问这个问题。
为什么我必须明确声明我不想从一个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";
}
让我明确一点,我不是在这里提倡失败。每个语句break
的末尾都有一个暗示。case
这两个示例在功能上是等效的。
如果我忘记了continue
案例 3 中的语句,编译器仍然可能对我大喊大叫。不过这种情况不会经常发生,我很乐意得到帮助。事实上,在这种情况下,我错过填写骨架代码的可能性非常高。有用。告诉我我忘记了一个break
声明是没有帮助的。让编译器满意只是更忙的工作。
看起来这可能只是 C 的保留(即使您在 case 语句中有代码,它也确实允许您失败)。有没有我看不到的更深层次的原因?
今天早上我正在查看一些编译器代码,其中有数百条case
语句switch
除了返回操作码之外什么都不做。他们每个人都发表了break
声明。这么多的打字和混乱......
人们怎么想?为什么第二个选项不是更好的默认值?