我在一些vb.net源代碼中看到這個:這與vb.net中的三元運算符類似嗎?
Dim sTest As String = "" & drTest("column")
有人告訴我,如果drTest(「列」)是什麼,然後STEST將被分配「」,所以它實際上是這樣做的:
Dim sTest As String = If("",Nothing,drTest("column"))
這樣做的第一種方式顯示的缺點是什麼?
使用If和IIf有什麼區別?
我在一些vb.net源代碼中看到這個:這與vb.net中的三元運算符類似嗎?
Dim sTest As String = "" & drTest("column")
有人告訴我,如果drTest(「列」)是什麼,然後STEST將被分配「」,所以它實際上是這樣做的:
Dim sTest As String = If("",Nothing,drTest("column"))
這樣做的第一種方式顯示的缺點是什麼?
使用If和IIf有什麼區別?
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"))
這是沒有意義的,不應該連編譯(或至少給予警告)。你的第一個代碼很好 - 它總是有效的,沒有任何缺點。目前還不清楚第二個代碼甚至試圖實現什麼。
雖然@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
如果你想使用如果逼近邏輯,你會尋找更多的東西像下面這樣:'如果(drTest(「列」)不算什麼,「」,drTest( 「column」))' – 2011-03-29 14:49:32
來自ac#背景,我對語法有點困惑? Of T是什麼意思?至於我的代碼如果,我把一個三元操作到一個C#到VB.NET轉換器,它產生了。 – Xaisoft 2011-03-29 14:50:39
@ Xoftoft'(Of T)'是VB編寫通用參數的方式,即它等同於''。至於你的代碼,它在C#中也是沒有意義的,它肯定不會編譯:'「」? null:drTest(「列」)'不是有效的C#。 –
2011-03-29 14:55:37