2011-03-29 45 views
2

我在一些vb.net源代碼中看到這個:這與vb.net中的三元運算符類似嗎?

Dim sTest As String = "" & drTest("column") 

有人告訴我,如果drTest(「列」)是什麼,然後STEST將被分配「」,所以它實際上是這樣做的:

Dim sTest As String = If("",Nothing,drTest("column")) 

這樣做的第一種方式顯示的缺點是什麼?

使用If和IIf有什麼區別?

回答

7

If三元條件運算符。

使用If和IIf有什麼區別?

IIf是大致如下實現普通函數:

Function If(Of T)(condition As Boolean, ifTrue As T, ifFalse As T) 
    If condition Then Return ifTrue 
    Return ifFalse 
End Function 

這意味着無論的condition值,它的兩個其他參數總是評價。這不會發生在If運營商。

但你的代碼其實就是做完全不同的事情:

Dim sTest As String = If("",Nothing,drTest("column")) 

這是沒有意義的,不應該連編譯(或至少給予警告)。你的第一個代碼很好 - 它總是有效的,沒有任何缺點。目前還不清楚第二個代碼甚至試圖實現什麼。

+0

如果你想使用如果逼近邏輯,你會尋找更多的東西像下面這樣:'如果(drTest(「列」)不算什麼,「」,drTest( 「column」))' – 2011-03-29 14:49:32

+0

來自ac#背景,我對語法有點困惑? Of T是什麼意思?至於我的代碼如果,我把一個三元操作到一個C#到VB.NET轉換器,它產生了。 – Xaisoft 2011-03-29 14:50:39

+0

@ Xoftoft'(Of T)'是VB編寫通用參數的方式,即它等同於''。至於你的代碼,它在C#中也是沒有意義的,它肯定不會編譯:'「」? null:drTest(「列」)'不是有效的C#。 – 2011-03-29 14:55:37

1

雖然@Konrad魯道夫的回答您的具體問題,我想繼續他離開的地方說:

這是沒有意義的,應該連 編譯(或至少給予警告) 。 你的第一個代碼很好 - 它始終工作 ,沒有任何缺點。這是 不清楚第二個代碼是什麼,即使 試圖實現。

他是對的,你甚至不應該做你的第二行建議。達到你想要的效果的簡單答案是使用TryCast代替。當drTest("column")包含一個值時,您只分配一個非空字符串值。既然是這樣的話,爲什麼不這樣做:

Dim sTest As String = TryCast(drTest("column"), String)

這樣你會得到你的價值,如果TryCast成功,否則,你得到Nothing

現在既然TryCast回報Nothing和因爲你的例子表明,只要你想分配"",你可能不希望走這條路,因爲這會導致到處理字符串虛無與「」 /的String.Empty挫折。如果你願意的話,你可以使用String.IsNullOrEmpty()方法,但是這要求你傳入字符串作爲參數,對我來說,這會讓你的代碼崩潰。另外,您也可以創建自己的StringExtensions模塊像我有和使用的分機檢查虛無和空虛:

Option Explicit On 
Option Strict On 

Imports System.Runtime.CompilerServices 

Public Module StringExtensions 

    <Extension()> _ 
    Public Function IsNullOrEmpty(ByVal s As String) As Boolean 
     Return s Is Nothing OrElse s.Trim.Length.Equals(0) 
    End Function 

    <Extension()> _ 
    Public Function IsNotNullOrEmpty(ByVal s As String) As Boolean 
     Return s IsNot Nothing AndAlso s.Trim.Length > 0 
    End Function 

End Module

然後實現自己的相對於虛無設置""的效果,可以使用的TryCast的組合而要做到我StringExtensions方法:

三元如果

Dim sColumn1 As String = TryCast(drTest("column1"), String) 
Dim sColumn2 As String = TryCast(drTest("column2"), String) 
Dim sColumn3 As String = TryCast(drTest("column3"), String) 

Dim sTest1 As String = If(sColumn1.IsNotNullOrEmpty, sColumn1, String.Empty) 
Dim sTest2 As String = If(sColumn2.IsNotNullOrEmpty, sColumn2, String.Empty) 
Dim sTest3 As String = If(sColumn3.IsNotNullOrEmpty, sColumn3, String.Empty)

沒有三元如果

Dim sTest1 As String = String.Empty 
Dim sTest2 As String = String.Empty 
Dim sTest3 As String = String.Empty 

Dim sColumn1 As String = TryCast(drTest("column1"), String) 
Dim sColumn2 As String = TryCast(drTest("column2"), String) 
Dim sColumn3 As String = TryCast(drTest("column3"), String) 

If sColumn1.IsNotNullOrEmpty Then sTest1 = sColumn1 
If sColumn2.IsNotNullOrEmpty Then sTest2 = sColumn2 
If sColumn3.IsNotNullOrEmpty Then sTest3 = sColumn3