代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

如果不是可选的,为什么C#会有中断[[副本]

  •  89
  • paxdiablo  · 技术社区  · 15 年前

    当我创建一个 switch

    switch (state) {
        case '1':
            state = '2';
        case '2':
            state = '1';
    }
    

    控件不能从一个case标签('case'1'(0x31):')落入另一个case标签

    如果你不被允许中途下车,那么这次旅行的目的是什么 break 什么声明?为什么语言设计者不直接忽略它,然后自动跳转到程序的末尾呢 转换 而不是强迫我们加入一个不必要的构造?

    4 回复  |  直到 12 年前
        1
  •  76
  •   Community CDub    5 年前

    Why is the C# switch statement designed to not allow fall-through, but still require a break? .

    引用突出的部分,这就是为什么他们不允许漏掉的原因:

    在C#中,switch语句要求显式流控制发生在case的末尾,即break、goto、return或throw。如果开发人员希望通过语义实现fall-through,那么可以通过case语句末尾的显式goto来实现。

    由于C#规则要求显式流控制发生在case块的末尾(通常是中断),许多人质疑为什么行为没有发生改变,以至于没有发生失败。也就是说,不必使break成为必需的,只需将switch的语义更改为不必为cases而崩溃。这是不做的原因是,那些非常习惯C++的开发者不会很难理解开关语句所做的事情。

        2
  •  88
  •   Jon Skeet    15 年前

    基本上使它对C/C++和java开发人员更为熟悉。我个人认为这是个错误,但这就是原因。

    我更喜欢强制阻塞:

    case '1':
    {
    }
    

    除此之外,这将避免switch/case的奇怪变量范围情况。当然,您仍然可以有多个箱子标签:

    case '0':
    case '1':
    {
    }
    

    也可以更简单地列出多个案例:

    case '0', '1':
    {
    }
    

    哦,你对现有语言的描述有点吹毛求疵:你没有 休息一下。只是案子的结局必须是遥不可及的。你也可以 throw goto return . 我可能也错过了其他人:)

        3
  •  49
  •   paxdiablo    15 年前

    你可以中途下车,但你必须这样做 goto 关键字:

    switch (state) {
        case '1':
            state = '2';
            goto case '2';
        case '2':
            state = '1';
            break;
    }
    

    break 转到 在C#,但你不能做的是不陈述你想要的,因为这是一个潜在的来源,很难发现错误。

    更容易发现你的代码 当你想要的时候 打破 (反之亦然)你忘了加上的地方。

    这听起来可能很愚蠢,但是很多对C++错误的原因进行了两个小时的搜索,突然意识到忘记添加一个 打破 你的代码一直在被破解。C#通过强迫你说出你想要什么来避免这种情况。

        4
  •  12
  •   simendsjo    15 年前

    如果您在案例1中没有任何代码,则允许您失败,因此您可以说“所有这些案例都共享这段代码”

    推荐文章