在C#中切换语句贯穿始终?
切换语句贯穿是我爱的switch
与if/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
中没有代码(见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和Java中是一个不常见的错误来源。
解决方法是使用goto,例如
switch (number.ToString().Length)
{
case 3:
ans += string.Format("{0} hundred and ", numbers[number / 100]);
goto case 2;
case 2:
// Etc
}
我认为开关/外壳的一般设计有点不幸。 它与C的距离太近 - 在范围等方面可能会做出一些有益的改变。可以做一个更智能的开关,可以进行模式匹配等,但是这实际上是从切换到“检查一系列条件” - 在这一点上可能会要求一个不同的名字。
历史上,切换延迟是现代软件缺陷的主要来源之一。 语言设计者决定强制在案件结束时跳过,除非您直接默认未经处理的下一个案例。
switch(value)
{
case 1:// this is still legal
case 2:
}
链接地址: http://www.djcxy.com/p/2423.html