44 votes

(OrElse and Or) et (AndAlso and And) - Quand utiliser?

2Quelle est la différence entre (OrElse et Or) et (AndAlso et And)? Y at-il une différence dans leurs performances, disons l'avantage de la correction ?? Existe-t-il une situation dans laquelle je ne devrais pas utiliser OrElse et AndAlso?

10voto

Gideon Engelberth Points 4509

Outre le court-circuit mentionné dans les autres réponses, Or - And sont utilisables comme opérateurs au niveau du bit, où OrElse - AndAlso ne le sont pas. Les opérations au niveau des bits incluent la combinaison des valeurs des énumérations Flags, telles que l'énumération FileAttributes où vous pouvez indiquer qu'un fichier est à la fois en lecture seule et masqué par FileAttributes.ReadOnly Or FileAttributes.Hidden

4voto

davidsleeps Points 4437

La différence est que OrElse et AndAlso court-circuit basé sur la première condition, ce qui signifie que si la première condition ne passe pas, la deuxième (ou plus) les conditions ne seront pas évaluées. Ceci est particulièrement utile lorsque l'une des conditions peut-être plus intense que les autres.

Exemple où l' Or est fine (les deux conditions évaluées):

If Name = "Fred" Or Name = "Sam" Then

Il vraiment n'importe pas de quelle manière ils sont évalués

La suite de AndAlso est utile, parce que la deuxième condition peut échouer

If Not SomeObject Is Nothing AndAlso CheckObjectExistsInDatabase(SomeObject) Then

Cela permet pour la première condition pour vérifier si l'objet a été défini et seulement si elle a été définie va aller vérifier la base de données (ou une autre tâche). Si cela avait été une plaine And mot-clé, à la fois devrait être évaluée.

2voto

dbasnett Points 4114

@Gideon - content que quelqu'un l'ait signalé. Voici un test simple qui montre l’impact dramatique d’AndAlso:

     Dim tm As New Stopwatch
    Const tries As Integer = 123456
    Dim z As Integer = 0
    Dim s() As String = New String() {"0", "one"}

    Debug.WriteLine("AndAlso")
    For x As Integer = 0 To s.Length - 1
        z = 0
        tm.Restart() 'restart the stopwatch
        For y As Integer = 0 To tries
            If s(x) = x.ToString AndAlso s(x) = y.ToString Then '<<<<<<<<<<
                z += 1
            End If
        Next
        tm.Stop()
        Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
    Next

    Debug.WriteLine("And")
    For x As Integer = 0 To s.Length - 1
        z = 0
        tm.Restart() 'restart the stopwatch
        For y As Integer = 0 To tries
            If s(x) = x.ToString And s(x) = y.ToString Then '<<<<<<<<<<
                z += 1
            End If
        Next
        tm.Stop()
        Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
    Next
 

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