C#:非法交换声明的解决方法?

可能重复:
在C#中切换语句贯穿始终?

下面的代码在C#中是非法的,因为控件不能从一个案例标签到另一个案例标签。 但是,这种行为在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;
}

从事语言工作的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和一个明确的分支有助于防止你编写bug,并且使未来的维护者清楚,fall-through是有意的。


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

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
}

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

链接地址: http://www.djcxy.com/p/84479.html

上一篇: C#: Workaround for Illegal Switch Statement?

下一篇: How can a case in a switch not have a break?