C#:非法Switch语句的变通方法?

C#:非法Switch语句的变通方法?,c#,c++,switch-statement,C#,C++,Switch Statement,可能重复: 以下代码在C#中是非法的,因为控制不能从一个案例标签转移到另一个案例标签。然而,这种行为在C++中是完全合法的。那么,您将如何在C#中编码相同的行为呢 从事该语言工作的Eric Lippert在这里谈到了它: 简短版本:最简单的修复方法是使用goto: switch (totalWords) { case TotalWords.Four: phrase = "Fox" + phrase; goto case TotalWords.Th

可能重复:

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


从事该语言工作的Eric Lippert在这里谈到了它:

简短版本:最简单的修复方法是使用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,并向未来的维护人员表明,这种失败是故意的。

从事该语言工作的Eric Lippert在这里谈到了这一点:

简短版本:最简单的修复方法是使用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和显式分支有助于防止编写错误,并向未来的维护人员表明,失败是故意的。

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

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语句的通用答案,但对于这种情况,它相当不错。

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

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语句的通用答案,但对于这种情况,它相当不错。

其中的副本包括使用“goto case”的好答案。其中的副本包括使用“goto case”的好答案。它假设TotalWords是线性的,在这种情况下是线性的,但如果它是一个标志(1,2,4,8),它将失败。它假设TotalWords是线性的,在本例中就是这样,但如果它是一个标志(1,2,4,8),它将失败。“我认为这里的基本原理是,10次缺失中有9次是错误,而不是故意的。”-这正是为什么他们一开始就不需要它的原因。所以你认为开关不需要
中断并仅在标签边界自动执行该操作?VB就是这样做的。“我认为这里的基本原理是,10次中断中有9次是错误,而不是故意的。”-这就是为什么他们一开始就不应该需要它的原因。所以你认为switch不应该需要
中断并仅在标签边界自动执行该操作?VB就是这样做的。