Gibt es eine VB.NET Äquivalent für C # 's ‚??‘ Operator?
-
03-07-2019 - |
Frage
Gibt es ein Äquivalent VB.NET für C # 's ??
Operator?
Lösung
Mit dem If()
Operator mit zwei Argumenten ( Microsoft Dokumentation ):
' 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))
Andere Tipps
Der IF()
Operator sollte den Trick für Sie tun:
value = If(nullable, defaultValueIfNull)
Die akzeptierte Antwort hat keine Erklärung auch immer und ist einfach nur ein Link.
Deshalb dachte ich, ich würde eine Antwort hinterlassen, die erklärt, wie die If
Betreiber Werke von MSDN genommen:
Wenn Operator (Visual Basic)
Verwendet Kurzauswertung bedingt eine von zwei zurück Werte. Die Wenn Operator kann mit drei Argumenten oder mit zwei genannt werden Argumente.
If( [argument1,] argument2, argument3 )
Wenn Operator aufgerufen, mit zwei Argumenten
Das erste Argument Wenn weggelassen werden. Dies ermöglicht dem Bediener unter Verwendung von nur zwei Argumenten aufgerufen werden. Die folgende Liste gilt nur, wenn die Wenn Operator mit zwei Argumenten aufgerufen wird.
Teile
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.
Wenn die Boolean Argument weggelassen wird, muss das erste Argument sein, Referenz- oder Nullable Type. Wenn das erste Argument ausgewertet Nichts , wird der Wert des zweiten Arguments zurück. In allen anderen Fällen wird der Wert des ersten Arguments zurück. Das folgendes Beispiel zeigt, wie diese Auswertung funktioniert.
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))
Ein Beispiel, wie mehr als zwei Werte (verschachtelter if
s) zu behandeln:
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)))
Sie können eine Erweiterungsmethode verwenden. Dieses funktioniert wie SQL COALESCE
und ist wahrscheinlich übertrieben für das, was Sie testen wollen, aber es funktioniert.
''' <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
Der eingebaute in If(nullable, secondChoice)
kann nur behandeln zwei Nullable-Entscheidungen. Hier kann man Coalesce
so viele Parameter wie gewünscht. Die erste nicht-null ein zurückgegeben werden, und der Rest der Parameter sind nicht danach (kurzgeschlossen, wie AndAlso
/ &&
und OrElse
/ ||
)
Die eine erhebliche Einschränkung der meisten dieser Lösungen ist, dass sie nicht kurzgeschlossen werden. Sie sind daher nicht wirklich entspricht ??
Der eingebaute „wenn“ Operator wird nicht nachfolgenden Parameter bewerten, es sei denn der frühere Parameter nichts auswertet.
Die folgenden Aussagen sind äquivalent.
C #
var value = expression1 ?? expression2 ?? expression3 ?? expression4;
VB
dim value = if(exression1,if(expression2,if(expression3,expression4)))
Dies wird in allen Fällen arbeiten, wo „??“ funktioniert. Jede der anderen Lösungen müßte mit äußerster Vorsicht verwendet werden, da sie leicht Laufzeit Fehler einführen könnten.
Überprüfen der Microsoft-Dokumentation über Falls Operator (Visual Basic) hier: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator
If( [argument1,] argument2, argument3 )
Hier sind einige Beispiele (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"))