C#的switch语句(2)
来源:互联网 发布:旧版本windows.old 编辑:程序博客网 时间:2024/05/17 22:11
使用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语句的功能。
另外,一般来说每个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标签的引用值允许是null。
- C#的switch语句(2)
- C#的switch语句
- C#的switch语句
- C#对switch语句的优化
- C#疑惑篇-变调的switch语句!
- C#对switch语句的优化
- javascript的switch语句与c#有所不同
- C# switch 语句的简单应用
- C#中switch语句
- NET 中C#的switch语句的语法
- C#中switch语句注意
- C#中switch语句注意
- C#之Switch分支语句
- 关于C#中switch语句的一点注意
- 在SQL中如何实现类似C#的switch语句
- C#中一种替换switch语句更优雅的写法
- Switch语句的实现机制(2)
- 奇怪的switch语句
- HDU-1009 FatMouse' Trade
- CMake Introduction 2
- 整个文件夹的拷贝 void CopyFolder( LPCTSTR pszSrc, LPCTSTR pszDes )
- C#的switch语句
- java 2D 游戏教程
- C#的switch语句(2)
- Trixbox CE 安装手记
- GridView控件初步使用概括11.23
- AMBA总线介绍
- 关联关系的级联操作
- 简单XNA_Windows Phone 7 3D动画
- xp win2003 远程桌面同步解决办法,绝对有效
- hibernate 支持的集合类型
- 小试vCenter 5.0安装