我在一些vb.net源代码中看到了这个:
Dim sTest As String = "" & drTest("column")
有人告诉我,如果drTest(“列”)什么都没有,那么sTest将被分配“”,所以它实际上在做:
Dim sTest As String = If("",Nothing,drTest("column"))
以我展示的第一种方式做这件事的不利之处是什么?
使用If和IIf有什么区别?
答案 0 :(得分: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"))
这没有任何意义,甚至不应该编译(或至少发出警告)。你的第一个代码很好 - 它始终有效并且没有任何缺点。目前尚不清楚第二个代码甚至试图实现什么。
答案 1 :(得分:1)
虽然@Konrad Rudolph已经回答了你的具体问题,但我想继续他离开的地方说:
这没有任何意义,甚至不应该 编译(或至少发出警告)。 你的第一个代码很好 - 它有效 永远也没有缺点。它的 不清楚第二个代码是什么 试图实现。
他是对的,你甚至不应该做你的第二行建议。实现您正在尝试的效果的简单答案是使用TryCast
代替。当drTest("column")
包含值时,您只分配非空字符串值。既然如此,为什么不这样做:
Dim sTest As String = TryCast(drTest("column"), String)
这样,如果TryCast
成功,您就会获得价值,否则您会获得Nothing
。
现在,TryCast
返回Nothing
,因为您的示例显示您要分配""
,您可能不想走这条路,因为它可能会导致处理的挫折感String Nothingness vs“”/ String.Empty。如果需要,您可以使用String.IsNullOrEmpty()
方法,但这需要您将字符串作为参数传入,并且对我来说,这会使您的代码变得棘手。或者,您可以像我一样创建自己的StringExtensions模块,并使用扩展来检查Nothingness和Emptiness:
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
然后,为了实现您对Nothingness设置""
的效果,可以使用TryCast
和我的StringExtensions方法的组合来执行:
使用三元If
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