2017-05-22 52 views
0

有人可以幫我理解爲什麼If/Then/End If工作但是IIf不工作?爲什麼IIf不能像If/Then/EndIf一樣工作?

我跑我的代碼這一點,它按預期工作:

For Each BtnObj In Padre.Controls 
    With BtnObj 
    If nullinator(.Tag) = 0 Then 
     .Visible = False 
    Else 
     .Visible = True 
    End If 
    End With 
Next 

這裏是我的 「nullinator」 功能:

Public Shared Function nullinator(ByVal CheckVal As String) As Integer 
    ' Receives a string and returns an integer (zero if Null or Empty or original value) 
    If String.IsNullOrEmpty(CheckVal) Then 
     Return 0 
    Else 
     Return CheckVal 
    End If 
End Function 

不過,如果我使用此代碼,nullinator(運行它。 Tag)= 0即使Tag屬性的內容爲空,也總是等於False。這裏的代碼:

For Each BtnObj In Padre.Controls 
    With BtnObj 
     IIf(nullinator(.Tag) = 0, .Visible = False, .Visible = True) 
    End With 
Next 

哦,是的,「Padre」變量是容器(父)對象。

爲什麼我沒有成功使用IIf的任何見解將不勝感激!

+2

當你的函數sig需要一個Integer時返回一個字符串不是一個好主意。 –

+0

可能的解決方案https://stackoverflow.com/questions/28377/performance-difference-between-iif-and-if,這些答案中的所有內容都會添加一種或另一種形式的差異...無需再添加一個圖書。 – Codexer

回答

2

IIf返回一個值:

.Visible = IIf(nullinator(.Tag) = 0, False, True) 

返回兩個對象中的一個,根據表達式的評估。

https://msdn.microsoft.com/en-us/library/27ydhh0d(v=vs.90).aspx

至於爲什麼一個對象被返回並且作爲paraemeters而不是任何其它數據類型:

(對象)存放32位(4字節)引用對象的地址。您可以將任何引用類型(字符串,數組,類或接口)分配給Object變量。 對象變量也可以引用任何值類型的數據(數字,布爾值,字符串,日期,結構或枚舉)。 (強調我自己)

通過允許函數採取任何類型,沒有必要爲函數重載。

https://msdn.microsoft.com/en-us/library/twcxd6b8(v=vs.90).aspx

+0

現在我無法理解的是,爲什麼在地獄他們用一個函數iif(布爾,對象,對象)作爲對象,而不是iif(of T)(布爾型,T,T)作爲T – Pierre

+0

@Pierre請參閱編輯 –

+2

@Pierre - 因爲'IIF'函數早於VB中的泛型支持。此外,他們用「IF」運算符代替了它,它更好。 –

0

...因爲你認爲什麼是分配實際上是比較。

IIF函數返回的值。所以它將返回.Visible = False.Visible = True的結果。

若要使其工作,您可能想要刪除比較,並只返回TrueFalse

相關問題