是否有一个VB.NET等价于C#的'??'运营商?

时间:2008-12-31 16:46:58

标签: vb.net operators null-coalescing-operator

C#的??运算符是否有VB.NET等价物?

6 个答案:

答案 0 :(得分:140)

使用If()运算符和两个参数(Microsoft documentation):

' Variable first is a nullable type.
Dim first? As Integer = 3
Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))

second = Nothing
' Variable first <> Nothing, so the value of first is returned again. 
Console.WriteLine(If(first, second))

first = Nothing second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))

答案 1 :(得分:102)

IF()运算符应该为您解决问题:

value = If(nullable, defaultValueIfNull)

http://visualstudiomagazine.com/listings/list.aspx?id=252

答案 2 :(得分:67)

接受的答案没有任何解释,只是一个链接 因此,我想我会留下一个答案来解释If运算符如何从MSDN中获取:


If Operator (Visual Basic)

  

使用短路评估有条件地返回两个中的一个   值。可以使用三个参数或两个参数调用 If 运算符   参数。

     
If( [argument1,] argument2, argument3 )


如果操作员使用两个参数调用

  

如果的第一个参数可以省略。这使操作员成为可能   通过仅使用两个参数来调用。以下列表适用   仅当使用两个参数调用 If 运算符时。


零件

Term         Definition
----         ----------

argument2    Required. Object. Must be a reference or nullable type. 
             Evaluated and returned when it evaluates to anything 
             other than Nothing.

argument3    Required. Object.
             Evaluated and returned if argument2 evaluates to Nothing.


  

当省略布尔参数时,第一个参数必须是a   引用或可空类型。如果第一个参数的计算结果为    Nothing ,返回第二个参数的值。在所有其他情况下,返回第一个参数的值。该   以下示例说明了此评估的工作原理。


VB

' Variable first is a nullable type. 
Dim first? As Integer = 3
Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.
Console.WriteLine(If(first, second))

second = Nothing 
' Variable first <> Nothing, so the value of first is returned again.
Console.WriteLine(If(first, second))

first = Nothing
second = 6
' Variable first = Nothing, so 6 is returned.
Console.WriteLine(If(first, second))

如何处理两个以上值(嵌套if s)的示例:

Dim first? As Integer = Nothing
Dim second? As Integer = Nothing
Dim third? As Integer = 6
' The LAST parameter doesn't have to be nullable.
'Alternative: Dim third As Integer = 6

' Writes "6", because the first two values are "Nothing".
Console.WriteLine(If(first, If(second, third)))

答案 3 :(得分:17)

您可以使用扩展方法。这个就像SQL COALESCE一样,对于你想要测试的东西来说可能有点过头了,但它确实有效。

    ''' <summary>
    ''' Returns the first non-null T based on a collection of the root object and the args.
    ''' </summary>
    ''' <param name="obj"></param>
    ''' <param name="args"></param>
    ''' <returns></returns>
    ''' <remarks>Usage
    ''' Dim val as String = "MyVal"
    ''' Dim result as String = val.Coalesce(String.Empty)
    ''' *** returns "MyVal"
    '''
    ''' val = Nothing
    ''' result = val.Coalesce(String.Empty, "MyVal", "YourVal")
    ''' *** returns String.Empty
    '''
    ''' </remarks>
    <System.Runtime.CompilerServices.Extension()> _
    Public Function Coalesce(Of T)(ByVal obj As T, ByVal ParamArray args() As T) As T

        If obj IsNot Nothing Then
            Return obj
        End If

        Dim arg As T
        For Each arg In args
            If arg IsNot Nothing Then
                Return arg
            End If
        Next

        Return Nothing

    End Function

内置If(nullable, secondChoice)只能处理两个可空的选择。在这里,可以根据需要Coalesce多个参数。将返回第一个非空的参数,其后的参数不会被评估(短路,如AndAlso / &&OrElse / ||

答案 4 :(得分:10)

大多数这些解决方案的一个重要限制是它们不会短路。因此它们实际上并不等同于??

内置的“if”运算符不会评估后续参数,除非之前的参数计算为空。

以下陈述是等效的。

C#

var value = expression1 ?? expression2 ?? expression3 ?? expression4;

VB

dim value = if(exression1,if(expression2,if(expression3,expression4)))

这适用于“??”的所有情况作品。任何其他解决方案都必须非常谨慎使用,因为它们很容易引入运行时错误。

答案 5 :(得分:2)

在此处查看有关If运算符(Visual Basic)的Microsoft文档:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator

If( [argument1,] argument2, argument3 )

以下是一些示例(VB.Net)

' This statement prints TruePart, because the first argument is true.
Console.WriteLine(If(True, "TruePart", "FalsePart"))

' This statement prints FalsePart, because the first argument is false.
Console.WriteLine(If(False, "TruePart", "FalsePart"))

Dim number = 3
' With number set to 3, this statement prints Positive.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))

number = -1
' With number set to -1, this statement prints Negative.
Console.WriteLine(If(number >= 0, "Positive", "Negative"))