是否有C#的??等价的VB.NET 操作员?


180

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


4
这里的大多数答案(包括接受的答案)都不正确,并且在功能上不等同于??。在任何情况下。正确的等效项是带有2个参数的if()语句。但是,可以嵌套第二个参数以获得与??完全相同的结果。有多个参数。
user1751825

您是说三元运算符吗?:例如return((value <0)?true:false)
Zeek2

Answers:


155

If()运算符与两个参数一起使用(Microsoft文档):

' 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))

3
我认为If()VB中的语句与if...?...:C#中的语句相同,而不是??运算符
Luke T O'Brien

2
@ LukeTO'Brien如果您将其与3个参数一起使用。如果将它与2个参数一起使用,则它的意义更大??(请参阅此问题的另一个答案:stackoverflow.com/a/20686360/1474939
Brian J

2
此答案显示了如何使用If 具有三个参数的 VB 。这是不是类似于C#的??运营商。更好的答案是Code Maverick的If带有两个参数。(几年前,尼克有类似的回答,但不包括MSDN的解释。)
ToolmakerSteve

1
这回答了一个完全不同的问题。
Marc Gravell

1
要了解以前的评论,请查看编辑历史记录。
Zev Spitz '18


70

接受的答案没有任何解释,仅是一个链接。
因此,我想留下一个解释该If操作员如何工作的答案(来自MSDN):


如果运算符(Visual Basic)

使用短路评估有条件地返回两个值之一。该如果操作员可以用三个参数或两个参数来调用。

If( [argument1,] argument2, argument3 )


如果运算符调用了两个参数

If的第一个参数可以省略。这样就可以仅使用两个参数来调用运算符。以下列表仅在使用两个参数调用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.


布尔省略参数,所述第一参数必须是参考或空类型。如果第一个参数的计算结果为 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))

有关如何处理两个以上值(嵌套ifs)的示例:

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)))

18

您可以使用扩展方法。这和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/ ||


8
因为该语言具有内置的运算符。甚至没有理由看扩展方法。
尼克

2
我不会重复别人的回答。我认为,如果需要使用单个语句检查多个值,则提供替代解决方案可能会很好。由于它不是一个错误的答案,那么应该否决它吗?
StingyJack

1
+1,用于提供使用泛型的实现并避免类型转换/装箱/拆箱
ulty4life 2013年

4
@Nick,对不起,但您完全是错误的。如果您有两个以上的合并参数,则内置函数不会删除该参数。
toddmo

您可以跳过obj参数,然后将主体设为Return args.FirstOrDefault(Function(arg) arg IsNot Nothing):-)
UlfÅkerstedt2015年

11

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

内置If运算符将不评估后续参数,除非较早的参数评估为空。

以下语句是等效的:

C#

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

VB

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

这将在所有可行的情况下??起作用。使用任何其他解决方案都必须格外谨慎,因为它们很容易引入运行时错误。


这在参数数量未知的情况下不起作用(嗯..并非没有使用roslyn或codedom来预编译一条语句以匹配执行时该时刻的参数数量)。
StingyJack

@StingyJack不是故意的。它确实做什么?? 操作员可以。
user1751825

2

在此处查看有关If Operator(Visual Basic)的Microsoft文档:https : //docs.microsoft.com/zh-cn/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"))

1
真好!删除评论!
亚历克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.