第 84 講:C# 2 之 bool 類型實例的 switch 語句用法
真香,真香……
Part 1 為什么 switch
早期不能判斷 bool
?
早期 switch
語句只讓使用對整數類型和字符串類型進行 switch
判斷,而 bool
和浮點數是不行的。浮點數不能用 switch
的原因很簡單,因為比較的數據是沒辦法精確表達的,所以這樣會導致很多很隱蔽的問題;而 bool
不能用的原因是,分支太少。
考慮 bool
用在 switch
里,會如何?
一個 case true
和 case false
就能表示完全的情況,但 default
此時就沒有意義了:因為永遠都不可能遇到了,前面?zhèn)z都能直接處理掉。所以,原因就是:分支太少。少到壓根用不到 default
,也確實沒必要:條件運算符 ?:
和 if
-else
完全可以應付這種小場面,你說是吧。
因此,C# 最開始的規(guī)則是不允許 bool
和浮點數作為判斷的;而 char
、string
、整數類型都是可以使用 switch
的。
Part 2 為什么 C# 2 又可以這么寫了呢?
C# 2 允許了 bool
作為 switch
的判斷。當然,它肯定是不讓你 case true
和 case false
都有了的情況下還寫一句 default
的。C# 2 規(guī)定,switch
判斷 bool
量的時候,只有如下三種情況:
case true
和default
(default
等價case false
);case false
和default
(default
等價case true
);case true
和case false
。
這三種情況,兩種標簽判斷是可以同時出現的,而 case true
、case false
和 default
不允許三種混用。
那么,為什么這種機制在 C# 2 里又可以用了呢?因為三值布爾 bool?
類型在 C# 2 里騰空出世。C# 2 的三值布爾類型就是可空的 bool
類型;而 bool
類型有兩種取值情況,再算上 null
,三值布爾一共是三種取值情況:true
、false
和 null
。如果還不開放的話,未免就顯得很難用:
c == 數值
就不必寫兩次。有了 switch
當然,這里你寫 case null:
代替 default:
也是可以的。
多了一種情況后,單純的 true
和 false
判斷就不夠了,因為還多了一個 null
的判斷情況。
Part 3 性能上和 if
語句還有 ?:
的區(qū)別
那么,?:
和 if
這種單純的格式,和 switch
寫起來,有什么區(qū)別嗎?
3-1 bool
的 switch
語句
明確地告訴你,沒有區(qū)別。我們來看這個代碼:
它最終會被編譯器改寫成這樣:
是吧,是一樣的吧。
3-2 bool?
和 switch
語句
你可能會問三值布爾的情況。假設代碼是這樣:
它會被編譯器改寫代碼成這樣:
三值布爾運算總歸是可空值類型吧,所以它也具有 HasValue
和 GetValueOrDefault
這些相關的成員。稍微注意一下,GetValueOrDefault
方法將獲取 bool?
類型的真正存儲數值;如果失敗,則獲取當前類型的默認數值(也就是 default(T)
表達式的結果)。因此,不論有沒有數值,bool?
類型也會通過這個方法返回 bool
的結果。
Part 4 沒了?
嗯,沒了。