c# - switch函数 - switch case js




在C#中切换语句贯穿始终? (10)

切换语句贯穿是我爱的switchif/else if结构之间的个人主要原因之一。 下面是一个例子:

static string NumberToWords(int number)
{
    string[] numbers = new string[] 
        { "", "one", "two", "three", "four", "five", 
          "six", "seven", "eight", "nine" };
    string[] tens = new string[] 
        { "", "", "twenty", "thirty", "forty", "fifty", 
          "sixty", "seventy", "eighty", "ninety" };
    string[] teens = new string[]
        { "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
          "sixteen", "seventeen", "eighteen", "nineteen" };

    string ans = "";
    switch (number.ToString().Length)
    {
        case 3:
            ans += string.Format("{0} hundred and ", numbers[number / 100]);
        case 2:
            int t = (number / 10) % 10;
            if (t == 1)
            {
                ans += teens[number % 10];
                break;
            }
            else if (t > 1)
                ans += string.Format("{0}-", tens[t]);
        case 1:
            int o = number % 10;
            ans += numbers[o];

            break;
        default:
            throw new ArgumentException("number");
    }
    return ans;
}

聪明的人正在忍受,因为string[]应该在函数之外声明:嗯,他们是,这只是一个例子。

编译器失败并出现以下错误:

Control cannot fall through from one case label ('case 3:') to another
Control cannot fall through from one case label ('case 2:') to another

为什么? 有没有办法得到这种行为没有三个if s?


在每个大小写块之后都需要跳转语句,例如中断,包括最后一个块是否为case语句或默认语句。 有一个例外(不同于C ++ switch语句),C#不支持从一个案例标签到另一个案例标签的隐式下降。 一个例外是如果case语句没有代码。

- C#switch()文档


“为什么”是为了避免意外跌落,对此我很感激。 这在C和Java中是一个不常见的错误来源。

解决方法是使用goto,例如

switch (number.ToString().Length)
{
    case 3:
        ans += string.Format("{0} hundred and ", numbers[number / 100]);
        goto case 2;
    case 2:
    // Etc
}

我认为开关/外壳的一般设计有点不幸。 它与C的距离太近 - 在范围等方面可能会做出一些有益的改变。可以做一个更智能的开关,可以进行模式匹配等,但是这实际上是从切换到“检查一系列条件” - 在这一点上可能会要求一个不同的名字。


(复制/粘贴我在别处提供答案

通过在case中没有代码(见case 0 ),或者使用特殊的goto case (参见case 1 )或goto default (参见case 2 )的形式,可以实现通过switch case的下降:

switch (/*...*/) {
    case 0: // shares the exact same code as case 1
    case 1:
        // do something
        goto case 2;
    case 2:
        // do something else
        goto default;
    default:
        // do something entirely different
        break;
}

开关(C#参考)说

C#需要切换部分的结束,包括最后一部分,

所以你也需要添加一个break; 到你的default区域,否则会出现编译错误。


他们改变了c#的switch语句(来自C / Java / C ++)。 我想这是因为人们忘记了坠落事件以及造成的错误。 我读过的一本书说要用goto来模拟,但这听起来不像是一个很好的解决方案。


他们通过设计排除了这种行为,以避免它不被意愿使用但造成问题。

只有在案件部分没有声明的情况下才能使用,如:

switch (whatever)
{
    case 1:
    case 2:
    case 3: boo; break;
}

你忘了添加“break” 陈述变为情况3.在情况2中,你将它写入了if块。 所以试试这个:

case 3:            
{
    ans += string.Format("{0} hundred and ", numbers[number / 100]);
    break;
}


case 2:            
{
    int t = (number / 10) % 10;            
    if (t == 1)            
    {                
        ans += teens[number % 10];                
    }            
    else if (t > 1)                
    {
        ans += string.Format("{0}-", tens[t]);        
    }
    break;
}

case 1:            
{
    int o = number % 10;            
    ans += numbers[o];            
    break;        
}

default:            
{
    throw new ArgumentException("number");
}

历史上,切换延迟是现代软件缺陷的主要来源之一。 语言设计者决定强制在案件结束时跳过,除非您直接默认未经处理的下一个案例。

switch(value)
{
    case 1:// this is still legal
    case 2:
}

在每个案例陈述需要中断转让陈述之后,即使它是默认情况。


您可以通过goto关键字来达到像c ++一样的效果。

EX:

switch(num)
{
   case 1:
      goto case 3;
   case 2:
      goto case 3;
   case 3:
      //do something
      break;
   case 4:
      //do something else
      break;
   case default:
      break;
}




switch-statement