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?
Réponses
Trop de publicités? 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
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.
@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