Esiste un equivalente VB.NET per C # ‘s’? operatore?

Esiste un equivalente VB.NET per i C # ?? operatore?

Utilizzare l’operatore If() con due argomenti ( documentazione 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)) 

L’operatore IF() dovrebbe fare il trucco per te:

 value = If(nullable, defaultValueIfNull) 

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

La risposta accettata non ha alcuna spiegazione ed è semplicemente un link.
Pertanto, ho pensato di lasciare una risposta che spieghi come funziona l’operatore If preso da MSDN:


Se operatore (Visual Basic)

Utilizza la valutazione di cortocircuito per restituire condizionalmente uno dei due valori. L’operatore If può essere chiamato con tre argomenti o con due argomenti.

 If( [argument1,] argument2, argument3 ) 

Se l’operatore chiama con due argomenti

Il primo argomento su If può essere omesso. Ciò consente all’operatore di essere chiamato utilizzando solo due argomenti. Il seguente elenco si applica solo quando l’operatore If viene chiamato con due argomenti.

Parti

 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. 

Quando l’argomento booleano viene omesso, il primo argomento deve essere un riferimento o un tipo nullable. Se il primo argomento restituisce Nothing , viene restituito il valore del secondo argomento. In tutti gli altri casi, viene restituito il valore del primo argomento. Il seguente esempio illustra come funziona questa valutazione.

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

Un esempio di come gestire più di due valori (nidificati 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))) 

È ansible utilizzare un metodo di estensione. Questo funziona come SQL COALESCE ed è probabilmente eccessivo per quello che stai provando a testare, ma funziona.

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

Il built-in If(nullable, secondChoice) può gestire solo due scelte annullabili. Qui, si possono Coalesce tutti i parametri desiderati. Il primo non nullo verrà restituito e il resto dei parametri non verrà valutato successivamente (cortocircuito, come AndAlso / && e OrElse / || )

L’unica limitazione significativa della maggior parte di queste soluzioni è che non causeranno cortocircuiti. Quindi non sono effettivamente equivalenti a ??

L’operatore “if” integrato non valuterà i parametri successivi a meno che il parametro precedente non valuti nulla.

Le seguenti dichiarazioni sono equivalenti.

C #

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

VB

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

Questo funzionerà in tutti i casi in cui “??” lavori. Qualsiasi altra soluzione dovrebbe essere utilizzata con estrema caucanvas, poiché potrebbero facilmente introdurre bug di runtime.

Consultare la documentazione Microsoft su If Operator (Visual Basic) qui: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator

 If( [argument1,] argument2, argument3 ) 

Ecco alcuni esempi (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"))