186 votes

Existe-t-il un équivalent en VB.NET de l'opérateur '??' en C# ?

Existe-t-il un équivalent en VB.NET de la fonction C# ?? opérateur ?

4 votes

La plupart des réponses données ici (y compris la réponse acceptée) ne sont pas correctes, et ne sont pas fonctionnellement équivalentes à ? ? dans toutes les situations. L'équivalent correct est l'instruction if() avec 2 arguments. Le deuxième argument peut toutefois être imbriqué pour obtenir exactement les mêmes résultats que ? ? avec plusieurs arguments.

0 votes

Voulez-vous dire l'opérateur ternaire ? : par exemple, return ((valeur < 0)?true:false)

161voto

Firas Assaad Points 10339

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

0 votes

IF est l'opérateur de coalescence en VB

3 votes

Je pense que le If() en VB est la même que l'instruction if...?...: en C#, et non le ?? opérateur

3 votes

@LukeTO'Brien C'est si vous l'utilisez avec 3 arguments. Si vous l'utilisez avec 2 arguments, c'est plutôt que ?? (voir une autre réponse à cette question : stackoverflow.com/a/20686360/1474939 )

107voto

Nick Points 5505

El IF() opérateur devrait faire l'affaire pour vous :

value = If(nullable, defaultValueIfNull)

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

3 votes

Le lien est (effectivement) rompu.

0 votes

Réponse ultérieure de Code Maverick donne l'explication MSDN, et des exemples plus détaillés.

73voto

Code Maverick Points 9448

La réponse acceptée ne comporte aucune explication et n'est qu'un simple lien.
Par conséquent, j'ai pensé laisser une réponse qui explique comment la If Les travaux de l'opérateur sont tirés de MSDN :


Opérateur If (Visual Basic)

Utilise l'évaluation du court-circuit pour retourner conditionnellement l'un des deux éléments suivants valeurs. Le site Si peut être appelé avec trois arguments ou avec deux arguments. arguments.

If( [argument1,] argument2, argument3 )

L'opérateur If appelé avec deux arguments

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

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 le Booléen est omis, le premier argument doit être un référence ou un type nullable. Si le premier argument est évalué à Rien la valeur du second argument est retournée. Dans tous les autres cas, la valeur du premier argument est retournée. L'exemple suivant 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))

Un exemple de la façon de traiter plus de deux valeurs (imbriquées). 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)))

20voto

StingyJack Points 10956

Vous pouvez utiliser une méthode d'extension. Celle-ci fonctionne comme SQL COALESCE et c'est probablement exagéré 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

Le système intégré If(nullable, secondChoice) ne peut traiter que deux des choix annulables. Ici, on peut Coalesce autant de paramètres que souhaité. Le premier paramètre qui n'est pas nul sera renvoyé, et les autres paramètres ne seront pas évalués par la suite (court-circuités, comme dans le cas de AndAlso / && y OrElse / || )

9 votes

Parce que la langue a un opérateur intégré. Il n'y a aucune raison d'envisager des méthodes d'extension.

3 votes

Je ne vais pas répéter la réponse de quelqu'un d'autre. Je me suis dit qu'il serait peut-être bon de proposer une autre solution si vous devez vérifier plusieurs valeurs avec une seule instruction. Puisqu'il ne s'agit pas d'une MAUVAISE réponse, faut-il la rétrograder ?

1 votes

+1 pour fournir une implémentation utilisant des génériques et évitant le casting/boxing/unboxing de type

1voto

Radderz Points 95

Cela n'a pas encore été suggéré, mais l'équivalent en VB de l'opérateur " ?" n'est-il pas IIf(condition, résultat vrai, résultat faux) ?

Ejemplo:

Dim postbackText as String = False
IIf(Page.isPostback, postbackText = "Page postback occurred", postbackText = "No postback occured")

Je crois que cette fonctionnalité est disponible depuis 2008 et qu'elle est certainement plus facile que l'utilisation d'une instruction IF, surtout lorsqu'on utilise du code frontal en ligne.

http://msdn.microsoft.com/en-us/library/27ydhh0d(v=vs.90).aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X