切換聲明是我喜歡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[]
應該在函數以外聲明:嗯,它們是,這只是一個例子。 this
編譯器失敗並出現如下錯誤: spa
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
的狀況下得到這種行爲? 設計
他們更改了c#的switch語句(來自C / Java / C ++)行爲。 我猜想的緣由是人們忘記了墜落而致使的錯誤。 我讀過的一本書說使用goto來模擬,但這聽起來不是一個很好的解決方案。 code
每一個case塊後都須要一個諸如break之類的跳轉語句,包括最後一個塊,不管是case語句仍是default語句。 除了一個例外,(與C ++ switch語句不一樣),C#不支持從一個case標籤到另外一個case標籤的隱式降級。 一個例外是case語句沒有代碼。 orm
- C#switch()文檔 three
C#不支持使用switch / case語句。 不知道爲何,但實際上沒有它的支持。 連鎖 文檔
他們經過設計省略了這種行爲,以免它不被意志使用但引發問題。 get
只有在案例部分中沒有語句時才能使用它,例如: 編譯器
switch (whatever) { case 1: case 2: case 3: boo; break; }
交換機漏洞歷史上是現代軟件中錯誤的主要來源之一。 語言設計者決定強制要求在案例結束時跳轉,除非您在沒有處理的狀況下直接默認爲下一個案例。
switch(value) { case 1:// this is still legal case 2: }