https://www.cnblogs.com/Interkey/p/3730432.htmlhtml
在IL彙編語言中的Switch指令 -- 按照標號來進行跳轉(和goto語句中的標號相同)
執行IL中Switch指令時,從運算棧頂彈出一個無符號整數,而後跳轉到整數對應的標號位置繼續執行
若是整數值沒有對應的標號,則忽略switch指令,調到switch指令以後的一條指令開始執行。c#
-- 結論 (實驗過程見原網頁) htm
1. 整數參數的Switch語句 對象
1a. 連續的整數
c#的switch的case語句對應IL的switch指令中的case子句blog
1b. 不連續的可是相近的整數
c#的switch的case語句對應IL的switch指令中的case子句,
可是對於case指令之間的"縫隙"整數,會自動跳轉default子句的地址字符串
1c. 很不連續的整數
若是按1b的思路,縫隙很大的話,IL中switch指令會憑空增長不少指向default子句指向地址的case子句
編譯器不使用switch指令,而是使用了beq指令 -- 取值若相等則跳轉到目標位置,不然繼續下一個取值編譯器
2. 枚舉類型的Switch語句
與對待整數沒有差異,由於枚舉值就是按照整數對待的;若是枚舉成員的取值不連續,則對應1b或1cstring
3. string類型的Switch語句it
3a. case子句數量<=4時
string是引用類型參數
一樣在IL中沒有使用switch指令
若是參數爲null的話,則執行流程直接跳轉到case null的指令塊中
不然,比較參數與case語句對應string的相等性(==),若相等,則跳轉到對應的地址後,跳出switch
-- 這就至關於被編譯成了一連串的if語句
那麼,當case子句過多時,豈不是會致使程序變慢?io
3b. case子句數量>4時
若是不是null的話,則會實例化一個字典泛型類 System.Collections.Generic.Dictionary`2<string,int32>
將分別出如今case子句中的string做爲key插入到字典中,每一個key的value分別對應從0開始的整數(switch子句的序號)
調用字典的TryGetValue()嘗試從字典中找到string參數所對應的字典元素
若是在字典中沒找到,則跳轉到default子句對應的位置
若是找到了,這裏出現了switch指令,根據從字典中取到的value整數值,進行switch子句的跳轉
switch以後的一條指令則爲一個無條件跳轉,直接跳轉到default子句
這裏是當switch指令在棧頂取到的整數值比switch指令中跳轉地址數量要大時,忽略switch直接執行以後的指令
3b狀況下,因爲Dictionary<TKey,TValue>類型經過key來取值的時間複雜度接近於O(1) -- 有助於提升效率
爲了微乎其微的效率提高 1. 儘可能在switch中使用連續的取值 2. 若是取值不連續,則使用盡可能少的case子句,並將會出現頻率高的case放在前面(與if...else if...else相似) 3. 若是使用了大量if語句來判斷一個字符串對象是否具備某值,改用Switch 4. 有其餘引用類型對象想要使用switch判斷但又不能使用時,能夠按照3b的思路本身實現。