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

问题描述:

我在一些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")) 

这是没有意义的,不应该连编译(或至少给予警告)。你的第一个代码很好 - 它总是有效的,没有任何缺点。目前还不清楚第二个代码甚至试图实现什么。

+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

虽然@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