一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

asp.net switch语句用法(C,C#)

时间:2011-07-11 编辑:简简单单 来源:一聚教程网

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 语句中没有代码时。

 

热门栏目