首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这类似于vb.net中的三元运算符吗?

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

Stack Overflow用户
提问于 2011-03-29 22:33:01
回答 2查看 1.1K关注 0票数 2

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

代码语言:javascript
运行
复制
Dim sTest As String = "" & drTest("column")

有人告诉我,如果drTest(“sTest”)为nothing,那么列将被赋值为"",因此它实际上是这样做的:

代码语言:javascript
运行
复制
Dim sTest As String = If("",Nothing,drTest("column"))

我所展示的第一种方式的缺点是什么?

使用If和IIf有什么区别?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-29 22:34:10

If是三元条件运算符。

使用If和IIf有什么区别?

IIf是一个普通的函数,其实现方式大致如下:

代码语言:javascript
运行
复制
Function If(Of T)(condition As Boolean, ifTrue As T, ifFalse As T)
    If condition Then Return ifTrue
    Return ifFalse
End Function

这意味着无论condition的值是多少,它的其他两个参数都会被求值。这不会发生在If运算符上。

但是你的代码实际上做的是完全不同的事情:

代码语言:javascript
运行
复制
Dim sTest As String = If("",Nothing,drTest("column"))

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

票数 7
EN

Stack Overflow用户

发布于 2011-03-30 05:16:42

虽然@Konrad Rudolph回答了你的具体问题,但我想继续他说的话:

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

他是对的,你甚至不应该做你第二行所建议的事情。要达到您想要的效果,简单的答案是使用TryCast。只有当drTest("column")包含一个值时,才会分配一个非空的字符串值。既然是这样,为什么不这样做呢:

代码语言:javascript
运行
复制
Dim sTest As String = TryCast(drTest("column"), String)

这样,如果TryCast成功,您将获得值,否则将获得Nothing

现在,由于TryCast返回Nothing,并且您的示例显示您希望分配"",因此您可能不想走这条路,因为它可能导致处理String Nothingness vs "“/ String.Empty的失败。如果需要,您可以使用String.IsNullOrEmpty()方法,但这需要您将字符串作为参数传入,而且对我来说,这会使您的代码变得笨拙。或者,您可以像我一样创建自己的StringExtensions模块,并使用扩展来检查虚无和空:

代码语言:javascript
运行
复制
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

然后,为了实现针对setting设置""的效果,可以结合使用TryCast和我的StringExtensions方法来完成以下操作:

如果为,则为带有三元的

代码语言:javascript
运行
复制
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)

如果为,则不带三元的

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5474228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档