2012-09-27 43 views
1

按鈕的寬度是123,爲什麼不以下更改它的寬度使用IIF錯誤

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 
    With Me.Button3 
     IIf(.Width = 123, .Width = 233, .Width = 150) 
    End With 
End Sub 

IIF是否只返回一個值?即如果我想設置按鈕的寬度屬性,那麼我是否需要使用If結構?

很少談到IIF在MSDN

回答

1

IIF是否只返回一個值?

是的。

即即使我想設置按鈕的寬度屬性,那麼我是否需要使用If結構?

不行,因爲你可以返回值分配給Width屬性:

With Me.Button3 
    .Width = IIf(.Width = 123, 233, 150) 
End With 

需要注意的是,在VB.NET的當前版本中,If Operator應該用來代替IIF,因爲它有各種優點(類型安全,短路等)。例如,使用If(...)將允許您的代碼在沒有額外投射的情況下編譯,即使您有Option Strict On(您應該)。

With Me.Button3 
    .Width = If(.Width = 123, 233, 150) 
End With 
+0

好吧 - 我假設VB的'Option Strict On'和VBA的'Option Explicit'等價的功能? – whytheq

+0

@whytheq:不,VB的Option Explicit等價於VBA的Option Explicit。 ['Option Strict'是新東西](http://msdn.microsoft.com/de-de/library/vstudio/zcd4xwzs.aspx)它禁止隱式轉換。 – Heinzi

+0

很高興我問 - 感謝您的額外信息+答案 – whytheq

2

你的代碼測試.Width = 123,那麼如果真或.Width = 150如果假返回布爾表達式.Width = 233,然後引發的結果了。這不是你想要的。你有三種選擇:

' IIf function - not recommended since it is not typesafe and evaluates all arguments. 
.Width = IIf(.Width = 123, 233, 150) 

' If operator - typesafe and only evaluates arguments as necessary. 
.Width = If(.Width = 123, 233, 150) 

' If statement - not an expression. 
If .Width = 123 Then .Width = 233 Else .Width = 150 
+0

正常 - 但沒有'==在VB'相比,C#這樣做的comiler如何決定'.WIDTH = 233'是一個布爾表達式,而不是我試圖設置屬性? – whytheq

+0

這取決於上下文。 ' = '被解釋爲賦值運算符,但是'='*裏面*表達式被解釋爲相等運算符。 –

+0

+1謝謝。所以'IIf'是一個'expression',而'If'不是一個'expression',而是一個'operator'? – whytheq

2

使用VB.NEt的If() - 語句。它被稱爲「條件運算符」,並以多種語言存在。 IIf是一個VB特定的函數,具有不同的行爲。 點擊此處瞭解詳情: Performance difference between IIf() and If

在這兩種情況下,IIF和如果只返回一個值(IIF那些不輸入,這是一個必須鑄造的對象)。這似乎是你想反正事情:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 
    Button3.Width = If(Button3.Width = 123, 233, 150) 
End Sub