asp教程.net switch语句用法(C,C#)
switch 语句是一个控制语句,它通过将控制传递给其体内的一个 case 语句来处理多个选择和枚举
int caseSwitch = 1;
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
Console.WriteLine("Case 2");
break;
default:
Console.WriteLine("Default case");
break;
}
One:
int i = 0;
switch (i)
{
case 0:
Console.WriteLine("0");
case 1:
Console.WriteLine("1");
break;
}
//在这里,想让i==0的时候执行
//Console.WriteLine("0"),然后"fall through"到下层执行Case 1。
//但是在C#中是不允许"fall through" 的。除非“case 0”一行语句都没有。
但是可以使用goto 语句来实现”fall through”
int i = 0;
switch (i)
{
case 0:
Console.WriteLine("0");
goto case 1;
case 1:
Console.WriteLine("1");
break;
}
在C#中每一个case xxx,都是一个标签,所以可以使用goto语句进行跳转。
Two:
在这里default语句不做任何事,但是没有加break;
提示如下:
C# 严格控制每一个Switch 的分支都不允许贯穿(“fall through”),例如有时候你可能会像下面这样:
该语句完全合法。
Three:
有时候你会在case里面定义变量,但是变量有可能重名,例如:
在case 0,和case 1 中定义了两个相同的变量 y,编译器会提示如下错误:
解决这个问题的方法很简单,加 “{}”,使Case 语句变成块语句。
当然,还有一种不为人知的解决方案,如下:
Four:
假设你有一个方法M,代码如下:
int M(bool b)
{
switch (b)
{
case true: return 1;
case false: return 0;
}
}
可以很明显的指导b 只有两个值,一个是true,一个是false,但是编译器却无法通过,提示:
因为编译器认为每一个switch结构都有可能执行,同时也认为都有可能不执行,但是方法M必须有int的返回值,所以编译器提示错误。
解决这个问题的方法也很简单:
int M(bool b)
{
switch (b)
{
case true: return 1;
default: return 0;
}
}
或:
int M(bool b)
{
return b ? 1 : 0;
}
使用switch语句时需注意以下几点:
不准遍历
C和C++语言允许switch语句中case标签后不出现break语句,但C#不允许这样,它要求每个标签项后使用break语句或跳转语句goto,即不允许从一个case自动遍历到其它case,否则编译时将报错。
一个程序用于计算一年中已度过的天数,month表示月份,day表示日期,计算结果保存在total中。为简便起见,我们把闰年的情况排除在外。C和C++程序员会利用一点技巧来实现这个程序:
total=365;
switch(month){
case 1:total-=31;
case 2:total-=28;
case 3:total-=31;
case 4:total-=30;
case 5:total-=31;
case 6:total-=30;
case 7:total-=31;
case 8:total-=31;
case 9:total-=30;
case 10:total-=31;
case 11:total-=30;
case 12:total-=31;
default:total+=day;
}
然而这种写法在C#中是不允许的。有经验的程序员会利用这个特点,但是很难保证任何人在编程时都不会忘记在case后面加一break语句,这时往往会造成一些不易察觉的错误。所以在C#中,如果标签项没有出现break语句或跳转语句goto,编译器将会要求程序员加上。
如果想象c,c++那样,执行完后继续遍历其它的语句,那也不难,只需要明确地加入这两条跳转语句即可:
●goto case label:跳至标签语句执行
●goto default:跳至default标签执行
那样,我们将上面的程序可以改写为:
total 365;
switch(month){
case 1:total-=31;goto case 2;
case 2:total-=28;goto case 3;
case 3:total-=30;goto case 4;
case 4:total-=31;goto case 5;
case 5:total-=30;goto case 6;
case 6:total-=31;goto case 7;
case 7:total-=30;goto case 8;
case 8:total-=31;goto case 9;
case 9:total-=30;goto case 10;
case 10:total-=31;goto case 11;
case 11:total-=30;goto case 12;
case 12:total-=31;goto default;
default:total+=day;
}
在避免了c,c++中常出现的由于漏写break而造成的错误的同时,“不准遍历”的原则还使得我们可以任意排列switch语句中的case项而不会影响switch语句的功能。本文发表于http://bianceng.cn
另外,一般来说每个switch项都以break,goto case或goto default结束,但实际上任何一种不导致“遍历”的结构都是允许的,例如throw和return语句同样可以跳出控制之外,因而下例是正确的:
switch(i){
case 0:
while(true) F();
case 1:
throw new ArgumentException();
case 2:
return;
}
把字符串当成常量表达式
VB程序员可能已经习惯把字符串当成常量表达式来使用,但C和C++却不支持这一点。但是,C#的switch语句与c,c++的另一个不同点是,C#可以把字符串当成常量表达式来使用。所以switch语句的控制类型可以是string类型。
下面的例子是实现浮动窗口提示。在Windows操作系统中,我们把鼠标移到某一个控件上停留几秒钟,将会出现一个浮动提示,说明该控件的作用等。例子中的GetButtonCaption方法用于获得按钮上的文字,ShowMessage表示在浮动提示窗口中显示信息。
string text=GetButtonCaption();
switch(text)
{
case "OK":ShowMessage("save the change and exit");break;
case "Retry":ShowMessage("return and retry");break;
case "Abort":ShowMessage("Abort the change and exit");break;
case "Help":ShowMessage("Get help from system");break;
}
实际上,在老版本的C语言中,switch语句的控制类型只允许是整数表达式或字符型表达式,而ANSI标准放宽了这一要求。C#中是对switch语句的控制类型的又一扩展。而且在C#中case标签的引用值允许是nul
注:
控制传递给与开关的值匹配的 case 语句。switch 语句可以包括任意数目的 case 实例,但是任何两个 case 语句都不能具有相同的值。语句体从选定的语句开始执行,直到 break 将控制传递到 case 体以外。在每一个 case 块(包括上一个块,不论它是 case 语句还是 default 语句)的后面,都必须有一个跳转语句(如 break)。但有一个例外,(与 C++ switch 语句不同)C# 不支持从一个 case 标签显式贯穿到另一个 case 标签。这个例外是当 case 语句中没有代码时。
电神魔傀2街机免费版 官方版v1.2.1
下载三国战纪2手游腾讯渠道服 安卓版v2.41.0.0
下载三国战纪2手游抖音渠道服 安卓版v2.41.0.0
下载三国战纪2折扣服 安卓版v2.41.0.0
下载叫我大掌柜小米版 安卓版v7.4.4
叫我大掌柜小米版是这款模拟经营类手游的渠道服版本,在此版本中
cooking fever正版 安卓最新版v23.0.2
cooking fever正版是一款非常好玩的模拟经营类手游
咖啡厅的生活故事 最新版v1.7
咖啡厅的生活故事是一款模拟经营游戏,玩家们在游戏中可以经营一
迅猛龙模拟器金币不减反增版 v1.1.8
迅猛龙模拟器无限金币版是一款动物模拟类游戏,玩家们将在游戏中
泽塔奥特曼升华器免广告版 v1.4
泽塔奥特曼升华器去广告版是游戏的破解版本,在该版本中为玩家去