VB.NET 中的合并运算符和条件运算符 [重复]

Posted

技术标签:

【中文标题】VB.NET 中的合并运算符和条件运算符 [重复]【英文标题】:Coalesce operator and Conditional operator in VB.NET [duplicate] 【发布时间】:2010-10-12 08:34:51 【问题描述】:

可能重复:Is there a conditional ternary operator in VB.NET?

我们能否像在 C# 中一样在 VB.NET 中使用 Coalesce 运算符(??) 和条件三元运算符(:)?

【问题讨论】:

这不是重复的问题。这个问题涉及到空合并运算符。 用于转换?? VBnet 使用带有两个参数的 If(,),如 here 如果不是 .duplicate 则过于宽泛,因为它包含两个问题 自 VS 2015 以来,现在可以使用 ?。在 vb.Net 中。 Dim x = Obj?.Child?.AnotherChild?.Something?.AString x 是一个字符串,如果任何对象都没有,则为 Nothing,如果所有对象都不是,则设置。 【参考方案1】:

我认为你可以使用内联 if 语句来接近:

//C#
int x = a ? b : c;

'VB.Net
Dim x as Integer = If(a, b, c)

【讨论】:

*注意:以这种方式使用 if 语句仅适用于 VB.NET 2008 及更高版本。 要将 If() 函数用作合并运算符,必​​须仅使用两个参数调用它,并且它必须用于引用类型:Dim objC = If(objA,objB) 这会将 objC 设置为 objA,除非 objA 是什么都没有,在这种情况下,objC 将被设置为 objB,无论它是否为 Nothing。 对于 2006+ 支持使用内存中的 IIf? @Brandito:IIF 函数就是这样一个函数,一个你可以自己编写的函数。它不进行合并,您必须自己编写该函数。 If 是一个内置运算符,如果您只提供 2 个参数,它会进行合并。 鉴于 IIf( ) 是一个函数而 If( ) 不是,主要的副作用是 If( ) 只评估真/假方面,其中 IIf( ) 将评估双方,甚至如果它只返回其中一个。【参考方案2】:
Sub Main()
    Dim x, z As Object
    Dim y As Nullable(Of Integer)
    z = "1243"

    Dim c As Object = Coalesce(x, y, z)
End Sub

Private Function Coalesce(ByVal ParamArray x As Object())
    Return x.First(Function(y) Not IsNothing(y))
End Function

【讨论】:

利用 LINQ,这是最有效的 Coalesce() 实现。 这个问题(以及下面的 ivan)是所有参数都将被评估。所以,如果我写Dim thingie = Coalesce(Session("thingie"), new Thingie),每次都会创建一个新的Thingie对象(尽管如果Session中存在Thingie,它将被丢弃)【参考方案3】:

仅供参考,字符串合并运算符

Private Function Coalesce(ByVal ParamArray Parameters As String()) As String
    For Each Parameter As String In Parameters
        If Not Parameter Is Nothing Then
            Return Parameter
        End If
    Next
    Return Nothing
End Function

【讨论】:

【参考方案4】:

如果应该是 IIf

Dim x as Integer=IIf(a,b,c)

【讨论】:

不。 IIf 评估所有参数,因为它是常规调用。见dotnetslackers.com/VB_NET/…

以上是关于VB.NET 中的合并运算符和条件运算符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 空合并运算符? [复制]

为啥和运算符在 vb.net

vb.net 算术运算导致溢出这是咋回事儿?

是啥 ?。运营商和我可以在哪里使用? JavaScript中的空值合并运算符[重复]

VB.net 和C#.net 各有啥优缺点

Python链式属性访问中的无传播[重复]