这类似于vb.net中的三元运算符吗?

时间:2011-03-29 14:33:01

标签: vb.net

我在一些vb.net源代码中看到了这个:

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

有人告诉我,如果drTest(“列”)什么都没有,那么sTest将被分配“”,所以它实际上在做:

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

以我展示的第一种方式做这件事的不利之处是什么?

使用If和IIf有什么区别?

2 个答案:

答案 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