【问题标题】:C#: Workaround for Illegal Switch Statement? [duplicate]C#:非法 Switch 语句的解决方法? [复制]
【发布时间】:2010-01-07 02:38:07
【问题描述】:

可能重复:
Switch statement fallthrough in C#?

以下代码在 C# 中是非法的,因为控制不能从一个 case 标签转移到另一个 case 标签。但是,这种行为在 C++ 中是完全合法的。那么,您将如何在 C# 中编写相同的行为?

enum TotalWords
{
   One = 1,
   Two,
   Three,
   Four
}

public String SomeMethod(TotalWords totalWords)
{     
     String phrase = "";

     switch (totalWords)
     {
        case TotalWords.Four:
             phrase = "Fox" + phrase;
        case TotalWords.Three:
             phrase = "Brown" + phrase;
        case TotalWords.Two:
             phrase = "Quick" + phrase;
        case TotalWords.One:
             phrase = "The" + phrase;
             break;

        default:
             break;
     }

     return phrase;
}

【问题讨论】:

标签: c# c++ switch-statement


【解决方案1】:

从事该语言研究的 Eric Lippert 在这里谈论它:
http://ericlippert.com/2009/08/13/four-switch-oddities/

短版:最简单的解决方法是使用 goto:

switch (totalWords)
 {
    case TotalWords.Four:
         phrase = "Fox" + phrase;
         goto case TotalWords.Three;
    case TotalWords.Three:
         phrase = "Brown" + phrase;
         goto case TotalWords.Two;
    case TotalWords.Two:
         phrase = "Quick" + phrase;
         goto case TotalWords.One;
    case TotalWords.One:
         phrase = "The" + phrase;
         break;

    default:
         break;
 }

我认为这里的基本原理是 10 次中有 9 次缺少中断是错误而不是故意的。强制您使用 break 和显式分支有助于防止您编写错误,并让未来的维护人员清楚地知道失败是故意的。

【讨论】:

  • “我认为这里的基本原理是 10 次中有 9 次缺少中断是错误而不是故意的。” - 这就是为什么他们一开始就不应该要求它的原因。
  • 所以你认为 switch 不应该需要break; 而只是在标签边界处自动执行? VB 就是这样做的。
【解决方案2】:

鉴于这是一个数字枚举,并且您在所有情况下都在执行基本相同的操作,您可以将其重写为循环:

String[] phrase_bits = new String[] { "The", "Quick", "Brown", "Fox" };

public String SomeMethod(TotalWords totalWords)
{
    int x = (int) totalWords;
    String phrase = ""
    while (--x >= 0) {
        phrase = phrase_bits[x] + phrase
    }
    return phrase
}

这不是所有 switch 语句的通用答案,但对于这种情况,它相当不错。

【讨论】:

  • 它假设 TotalWords 是线性的,但在这种情况下是线性的,但如果它是一个标志 (1,2,4,8),它将失败。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多