Gibt es ein VB.NET-Äquivalent für C # ‘?? Operator?

Gibt es ein VB.NET-Äquivalent für C # ?? Operator?

Verwenden Sie den Operator If() 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)) 

Der Operator IF() sollte den Trick für Sie tun:

 value = If(nullable, defaultValueIfNull) 

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

Die akzeptierte Antwort hat keinerlei Erklärung und ist nur ein Link.
Daher dachte ich, ich würde eine Antwort hinterlassen, die erklärt, wie der If Operator von MSDN übernommen wird:


Wenn Operator (Visual Basic)

Verwendet die Kurzschlussauswertung, um einen von zwei Werten bedingt zurückzugeben. Der If- Operator kann mit drei Argumenten oder mit zwei Argumenten aufgerufen werden.

 If( [argument1,] argument2, argument3 ) 

Wenn Operator mit zwei Argumenten aufgerufen wird

Das erste Argument zu If kann weggelassen werden. Dies ermöglicht den Aufruf des Operators mit nur zwei Argumenten. Die folgende Liste gilt nur, wenn der Operator If 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 das boolesche Argument nicht angegeben wird, muss das erste Argument ein Referenz- oder Nullwerttyp sein. Wenn das erste Argument Nothing ergibt, wird der Wert des zweiten Arguments zurückgegeben. In allen anderen Fällen wird der Wert des ersten Arguments zurückgegeben. Das folgende 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 für die Behandlung von mehr als zwei Werten (verschachtelt 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))) 

Sie können eine Erweiterungsmethode verwenden. Dieser funktioniert wie SQL COALESCE und ist wahrscheinlich zu COALESCE für das, was Sie testen wollen, aber es funktioniert.

  '''  ''' Returns the first non-null T based on a collection of the root object and the args. '''  '''  '''  '''  ''' 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 ''' '''   _ 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 

Das integrierte If(nullable, secondChoice) kann nur zwei NULL- If(nullable, secondChoice) verarbeiten. Hier kann man beliebig viele Parameter zusammenfassen. Der erste Nicht-Null-Wert wird zurückgegeben und der Rest der Parameter wird danach nicht ausgewertet (kurzgeschlossen, wie AndAlso / && und OrElse / || )

Die eine wesentliche Einschränkung der meisten dieser Lösungen besteht darin, dass sie nicht kurzschließen. Sie sind daher eigentlich nicht gleichwertig ??

Der integrierte “if” -Operator wertet nachfolgende Parameter nicht aus, es sei denn, der frühere Parameter ergibt nichts.

Die folgenden Aussagen sind äquivalent.

C #

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

VB

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

Dies funktioniert in allen Fällen, in denen “??” funktioniert. Alle anderen Lösungen müssten mit äußerster Vorsicht verwendet werden, da sie leicht Laufzeiterrors verursachen könnten.

Überprüfen Sie die Microsoft-Dokumentation zu If Operator (Visual Basic) hier: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator

 If( [argument1,] argument2, argument3 ) 

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