Existe-t-il un équivalent VB.NET pour l' ??
opérateur C # ?
Existe-t-il un équivalent VB.NET pour l' ??
opérateur C # ?
Réponses:
Utilisez l' If()
opérateur avec deux arguments ( documentation 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))
If()
déclaration en VB est la même que celle if...?...:
en C #, pas l' ??
opérateur
??
(voir une autre réponse à cette question: stackoverflow.com/a/20686360/1474939 )
If
avec trois paramètres . Ce n'est pas similaire à l' ??
opérateur de C # . La meilleure réponse est le If de Code Maverick avec deux arguments . (Nick avait une réponse similaire, des années plus tôt, mais n'inclut pas l'explication de MSDN.)
L' IF()
opérateur devrait faire l'affaire pour vous:
value = If(nullable, defaultValueIfNull)
La réponse acceptée n'a aucune explication et n'est qu'un lien.
Par conséquent, j'ai pensé laisser une réponse expliquant le fonctionnement de l' If
opérateur à partir de MSDN:
Utilise l'évaluation des courts-circuits pour renvoyer conditionnellement l'une des deux valeurs. L' opérateur If peut être appelé avec trois arguments ou avec deux arguments.
If( [argument1,] argument2, argument3 )
Le premier argument de If peut être omis. Cela permet à l'opérateur d'être appelé en utilisant seulement deux arguments. La liste suivante s'applique uniquement lorsque l' opérateur If est appelé avec deux arguments.
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.
Lorsque l' argument booléen est omis, le premier argument doit être une référence ou un type Nullable. Si le premier argument a la valeur Nothing , la valeur du deuxième argument est renvoyée. Dans tous les autres cas, la valeur du premier argument est renvoyée. L'exemple suivant illustre le fonctionnement de cette évaluation.
' 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))
Exemple de gestion de plus de deux valeurs (imbriquées if
):
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)))
Vous pouvez utiliser une méthode d'extension. Celui-ci fonctionne comme SQL COALESCE
et est probablement excessif pour ce que vous essayez de tester, mais cela fonctionne.
''' <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
L'intégré If(nullable, secondChoice)
ne peut gérer que deux choix Nullable. Ici, on peut Coalesce
autant de paramètres que souhaité. Le premier non nul sera retourné, et le reste des paramètres ne sera pas évalué après cela (court-circuité, comme AndAlso
/ &&
et OrElse
/ ||
)
Return args.FirstOrDefault(Function(arg) arg IsNot Nothing)
:-)
La seule limitation importante de la plupart de ces solutions est qu'elles ne court-circuitent pas. Ils ne sont donc pas réellement équivalents à ??
.
L' If
opérateur intégré n'évalue pas les paramètres suivants à moins que le paramètre précédent n'évalue à rien.
Les affirmations suivantes sont équivalentes:
C #
var value = expression1 ?? expression2 ?? expression3 ?? expression4;
VB
dim value = if(expression1,if(expression2,if(expression3,expression4)))
Cela fonctionnera dans tous les cas où cela ??
fonctionne. Toutes les autres solutions devraient être utilisées avec une extrême prudence, car elles pourraient facilement introduire des bogues d'exécution.
Consultez la documentation Microsoft sur If Operator (Visual Basic) ici: https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/if-operator
If( [argument1,] argument2, argument3 )
Voici quelques exemples (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"))