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

來源:互聯網
上載者:User

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 語句中沒有代碼時。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.