web-dev-qa-db-ja.com

C#の「??」に相当するVB.NETはありますかオペレーター?

C#の??演算子に相当するVB.NETはありますか?

168
Nathan Koop

If()演算子を2つの引数とともに使用します( 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))
141
Firas Assaad

IF()演算子はあなたのためのトリックをするべきです:

value = If(nullable, defaultValueIfNull)

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

103
Nick

拡張メソッドを使用できます。これは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)は、two nullableの選択のみを処理できます。ここでは、必要な数のパラメータをCoalesceできます。最初のnull以外のパラメータが返され、残りのパラメータはその後評価されません(AndAlso/&&OrElse/||のような短絡)

17
StingyJack

これらのソリューションのほとんどの1つの重要な制限は、短絡しないことです。したがって、実際には??と同等ではありません。

組み込みの「if」演算子は、前のパラメーターが何も評価しない限り、後続のパラメーターを評価しません。

次のステートメントは同等です。

C#

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

VB

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

これは、「??」のすべての場合に機能します。動作します。他のソリューションは、実行時のバグを簡単に導入する可能性があるため、非常に注意して使用する必要があります。

10
user1751825

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"))
2
FN90