前段去书店看书,找到一本写得不错的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") '更多.net源码和教程,来自[乐博网 www.lob.cn] 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次的情況下,其間速度的差異幾乎可忽略不計。 |