2011-02-08 63 views
1

是否清潔王牌表現這裏:使用IF ... ELSE VS如果()

版本1:

Function MyFunc(ByVal param as String) As String 
    Dim returnValue as String 
    If param Is Nothing Then 
     returnValue = "foo" 
    Else 
     returnValue = param 
    return returnValue 

版本2:

Function MyFunc(ByVal param as String) As String 
    return If(param,"foo") 

版本1所直接涉及拆箱String秒。版本2處理所有盒裝Object s。 [IF()需要的testexpression作爲對象,一個FalsePart爲對象,並返回一個對象]

[可以不加評論]
COMMENT:ja72,固定我的命名。
評論:馬克,所以你會去與版本2?

+3

有沒有這樣的事情作爲盒裝/拆箱字符串 - 裝箱只適用於作爲`對象`訪問的值類型。字符串是引用類型,但也有**有**沒有`對象`那裏。最後,VB沒有一個空合併運算符嗎?在C#中,這將只是`返回參數? 「foo」;` – 2011-02-08 20:13:08

+2

@馬克礫石+1。 VB.Net有??,你正在看。如果(OBJ1,OBJ2)。 :) – 2011-02-08 20:20:01

+0

請參閱http://stackoverflow.com/questions/4619593/is-the-null-coalesce-operator-thread-safe - 這是C#,但應該有見地(見第一個答覆)。你也可以做同樣的檢查VB.NET IL。 – 2011-02-08 21:00:12

回答

7

我認爲明晰勝過一切。

If(obj1,obj2)函數是VB.NET的空合併運算符。它的功能與C#中的obj1 ?? obj2相同。因此,每個人都應該知道它的含義,並且應該在簡明重要的地方使用它。

雖然If/Else聲明是乾淨,簡單和明顯的,在這種特殊情況下,我傾向於If函數。

1

我相信這兩個實現幾乎是一樣的,我會用第二個,因爲它更短。

3

編譯器會根據優化級別將這兩個優化爲相同的代碼或幾乎相同(請參閱項目屬性)。

用這種方法編寫兩個方法,編譯它們並使用Reflector來查看VB.Net反編譯的代碼(甚至是MSIL),你會發現執行程序中很少(幾十億分之一秒)或沒有差別。

編譯器優化通常會處理正常模式,允許您編寫if語句並以不同方式循環。例如在.Net中,foreach,while,do等實際上並不存在。它們是語言特定的功能,彙編到彙編級別的goto-statement邏輯。使用反射器來看看其中的一些,你會學到很多東西! :)

請注意,編譯器無法優化爲「最佳狀態」的錯誤代碼是可能的,甚至可能比編譯器做得更好。瞭解.Net程序集和MSIL意味着更好地理解編譯器。

2

真的嗎?我認爲這個功能不會成爲任何應用程序的瓶頸,所以只需簡潔明瞭即可。

我會建議:

Public Function TXV(ByVal param As String) As String 
    Return If(param Is Nothing, "foo", param) 
End Function 

,並確保該函數返回一個字符串(保持類型安全)。順便說一句,爲什麼你的函數MySub?它不應該是MyFunc

0

因爲我來自C背景,所以我會選擇三元運算符大多數情況下清楚發生了什麼 - 在這種情況下,有重複,可以是慣用的。同樣,在T-SQL中,您可以使用COALESCE(a,b,c,d,e)來避免出現一堆條件並簡單地獲取第一個非空值 - 這是慣用且易於閱讀的。

請注意舊的IIf函數與新的If運算符不同,因此,雖然新函數能夠正確處理副作用和短路,但它只是一個字符,遠離完全不同的行爲,人們一直很謹慎。

http://secretgeek.net/iif_function.asp

http://visualbasic.about.com/od/usingvbnet/a/ifop.htm

我不認爲它會在性能方面無關緊要,因爲優化是這些類型的變換相當不錯。