web-dev-qa-db-fra.com

Existe-t-il un équivalent VB.NET pour C '' '' ' opérateur?

Existe-t-il un équivalent de VB.NET pour les ?? opérateur?

168
Nathan Koop

Utilisez l'opérateur If() 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))
141
Firas Assaad

L'opérateur IF() devrait vous aider:

value = If(nullable, defaultValueIfNull)

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

103
Nick

La réponse acceptée n’a aucune explication et n’est qu’un simple lien.
J'ai donc pensé laisser une réponse expliquant le fonctionnement de l'opérateur If extrait de MSDN:


Si opérateur (Visual Basic)

Utilise l'évaluation par court-circuit pour renvoyer sous condition l'une des deux valeurs. L'opérateur Si peut être appelé avec trois arguments ou avec deux arguments.

If( [argument1,] argument2, argument3 )


Si l'opérateur est appelé avec deux arguments

Le premier argument de Si peut être omis. Cela permet à l'opérateur d'être appelé en utilisant seulement deux arguments. La liste suivante ne s'applique que lorsque l'opérateur Si est appelé avec deux arguments.


Les pièces

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 est évalué à 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.


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

Voici un exemple de traitement de plus de deux valeurs (ifs imbriqué):

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)))
67
Code Maverick

Vous pouvez utiliser une méthode d'extension. Celui-ci fonctionne comme SQL COALESCE et est probablement trop cher 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

La If(nullable, secondChoice) intégrée ne peut gérer que deux nullable choix. Ici, on peut Coalesce autant de paramètres que désiré. 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/||)

17
StingyJack

La seule limitation importante de la plupart de ces solutions est qu’elles ne court-circuiteront pas. Ils ne sont donc pas réellement équivalents à ??

L'opérateur "if" intégré n'évaluera pas les paramètres suivants à moins que le paramètre précédent ne donne rien.

Les affirmations suivantes sont équivalentes.

C #

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

VB

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

Cela fonctionnera dans tous les cas où "??" travaux. Toutes les autres solutions devraient être utilisées avec une extrême prudence, car elles pourraient facilement introduire des bogues d'exécution.

10
user1751825

Consultez la documentation de 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"))
2
FN90