[VB.NET]If V.S IIf
前陣子去書局翻書,看到一本寫的不錯的VB.NET入門書,很適合初學者學習使用,作者是施威明工作室。稍微翻了一下,雖是簡單的入門書,但書中仍是有些我沒注意到的東西,像是這篇提到的If函式。開始用VB.NET到現在也已經一年多了,一直以為If就只能當陳述式用,看了書上描述才知道原來也有類似IIf的用法。
但若是If跟IIf功用完全一樣的話,又為何要有兩道函式呢?書上做了些許的描述,主要的差異是If的效率會比IIf好,也就是會比較快。
其用法與說明簡列如下:
基本上If三個參數的多載函式用法幾乎跟IIf一樣,硬要說有啥不同的話,大概只有兩點,第一點差異就是If的後兩個參數需能互相擴展轉換(也許說成相同型態會更為恰當,這邊採用Visual Studio說明的說法),所以像下圖的寫法就會跑出錯誤。
而IIf無此限制,因此像下圖這樣寫法就無錯誤出現。
第二點差異就是If前面需有變數去接收函式回傳值,若前面無變數去接收回傳值,Visual Studio會將它視為是If陳述式,因此會出現如下錯誤:
同樣的IIf無此限制,因此不會出現錯誤,最多只能算是沒啥意義的寫法。
接著我們順便來看一下If兩個參數的多載函式的用法,簡單來說該函式的用法就是當第一個參數不為Nothing,該函式的回傳值就為第一個參數,反之若第一個參數為Nothing,該函式的回傳值就為第二個參數。看個簡單的範例,假設今天我們宣告了一個TextBox如下:
Dim tbx As TextBox = Nothing
若是這樣宣告,則當我們要使用該TextBox時會需要去判斷TextBox是否是Nothing,若是,我們會去New出TextBox物件,我們寫的Code可能會長的像下面這樣:
If tbx Is Nothing Then tbx = New TextBox
若此時運用If函式的話,寫法大概如下:
tbx = If(tbx, New TextBox)
了解了用法以後,我們當然不能錯過比較兩者之間速度上的差異,畢竟這是兩者最大的不同點。為了測試我們撰寫如下的測試程式:
Private Sub TestIfAndIIf(ByVal loopCount As Integer)
Dim sw As New Stopwatch
Dim o As Object
Console.WriteLine("Test If")
sw.Start()
For i As Integer = 1 To loopCount
o = If(True, True, False)
Next
Console.WriteLine("花費時間: " & sw.ElapsedMilliseconds)
sw.Reset()
Console.WriteLine("Test IIf")
sw.Start()
For i As Integer = 1 To loopCount
o = IIf(True, True, False)
Next
Console.WriteLine("花費時間: " & sw.ElapsedMilliseconds)
End Sub
測試結果如下:
loopCount | If | IIf |
10000 | 0 ms | 0 ms |
100000 | 1 ms | 3 ms |
1000000 | 10 ms | 32 ms |
10000000 | 101 ms | 326 ms |
統計一下測試數據
可以清楚的看出兩者間速度的比約為 1:3,不過這是當使用很多次的情況之下,在使用次數小於100000次的情況下,其間速度的差異幾乎可忽略不計。