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


180

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


4
ここでのほとんどの回答(承認された回答を含む)は正しくなく、機能的に同等ではありませんか?すべての状況で。正しい同等物は、2つの引数を持つif()ステートメントです。ただし、2番目の引数をネストして、まったく同じ結果を得ることができますか?複数の引数を持ちます。
user1751825

三項演算子を意味しますか?:たとえばreturn((value <0)?true:false)
Zeek2

回答:


155

If()2つの引数を指定して演算子を使用します(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 、3つのパラメーターで VBを使用する方法を示しています。それはあるではない C#のに似??演算子。より良い答えは、2つの引数を持つCode MaverickのIfです。(ニックは数年前に同様の答えを出しましたが、MSDNからの説明は含まれていません。)
ToolmakerSteve

1
これは完全に異なる質問に答えます。
Marc Gravell

1
以前のコメントを理解するには、編集履歴を見てください。
Zev Spitz


70

受け入れられた答えはまったく説明がなく、単なるリンクにすぎません。
したがって、IfMSDNから取得したオペレーターの動作を説明する答えを残しておこうと思いました。


if演算子(Visual Basic)

短絡評価を使用して、2つの値のいずれかを条件付きで返します。もしのオペレータは、3つの引数を指定してか、二つの引数で呼び出すことができます。

If( [argument1,] argument2, argument3 )


演算子が2つの引数で呼び出された場合

Ifの最初の引数は省略できます。これにより、2つの引数のみを使用してオペレーターを呼び出すことができます。次のリストは、If演算子が2つの引数で呼び出された場合にのみ適用されます。


部品

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.


ときブール引数が省略され、最初の引数は参照またはNULL可能タイプでなければなりません。最初の引数がNothingと評価され た場合、2番目の引数の値が返されます。それ以外の場合はすべて、最初の引数の値が返されます。次の例は、この評価がどのように機能するかを示しています。


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

3つ以上の値(ネストされた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

拡張メソッドを使用できます。これCOALESCEはSQLのように機能し、テストしようとしているものに対してはやり過ぎですが、機能します。

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

組み込みは、2つの null可能な選択肢If(nullable, secondChoice)しか処理できません。ここでは、必要な数のパラメータを使用できます。最初のnullでないものが返され、残りのパラメーターはその後評価されません(/ および/ などの短絡)CoalesceAndAlso&&OrElse||


8
言語には組み込みの演算子があるからです。拡張メソッドを調べる理由さえありません。
Nick、

2
他の人の答えを繰り返すつもりはありません。単一のステートメントで複数の値をチェックする必要がある場合は、代替ソリューションを提供するのが良いと考えました。間違った答えではないので、反対票を投じるべきでしょうか?
StingyJack 2008

1
ジェネリックを使用して実装を提供し、型キャスト/ボックス化/ボックス化
解除

4
@ニック、申し訳ありませんが、あなたはただの間違いです。3つ以上の合体引数がある場合、組み込み関数はそれをカットしません。
toddmo 2014年

objパラメータをスキップして、本文をReturn args.FirstOrDefault(Function(arg) arg IsNot Nothing):-)にすることができます
UlfÅkerstedtSe​​p

11

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

組み込み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オペレーター(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"))

1
いいね!コメントを削除しています!
アレック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.