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