Hallo liebe Community.
Oft sehe ich im Forum Anfänger, die in If-Abfragen o.ä. die Operatoren And und Or verwenden, häufig werden dann die Operatoren AndAlso und OrElse in den Raum geworfen.
Mit diesem kleinen Tutorial möchte ich einmal klar stellen, was der Unterschied ist und wo man was verwendet.
Logische Operationen
Grundsätzlich sollten bei logischen Operationen immer AndAlso und OrElse verwendet werden. Warum werde ich anhand eines kleinen Beispiels zeigen. Auch wenn die Operatoren And und Or funktionieren ist ihre Funktionsweise eigentlich eine andere (siehe Bitoperatoren) und die logischen Eigenschaften sind nur eine "Nebenerscheinung".
Auf den ersten Blick scheinen diese zwei If-Abfragen genau dasselbe zu tun, führt man den Code jedoch aus wird folgendes passieren:
Die erste Abfrage wird einfach übersprungen, die zweite wird aber eine NullReferenceException werfen. Das liegt am unterschiedlichen Verhalten von And und AndAlso, welches ich nun näher beschreiben werde.
Verhalten von And:
Wenn die Ausführung das And erreicht wird zuerst die erste Bedingung geprüft, in diesem Fall
Verhalten von AndAlso:
Wie beim And wertet AndAlso zuerst die erste Bedingung aus. AndAlso geht nun aber intelligenter vor. Da beide Bedingungen bei einer Und-Verknüpfung wahr sein müssen, die erste Bedingung aber falsch ist, gibt AndAlso gleicht
Selbes gilt auch für OrElse. Sobald die erste Bedingung wahr ist wird bereits
Durch dieses spezielle Verhalten wird erstens die Performance erhöht und zweiten lassen sich Fehler leichter vermeiden (wie oben). Hätte man das ganze mit And programmieren wollen, so hätte man dies tun müssen:
Deutlich sperriger als mit AndAlso, wie ich finde.
Wenn man also mit AndAlso und OrElse arbeitet sollte man immer darauf achten die Bedingungen so aufzureihen, dass ein Ergebnis möglichst früh erhalten werden kann, also Bedingungen, die wahrscheinlicher zu einem vorzeitigen Abbruch führen, weiter vorn. Auch muss man auf die richtige Reihenfolge achten, wenn man solche Fehleranfälligen Bedingungen wie oben hat.
Es gibt eine Ausnahme, bei der man And und Or als logische Operanden trotzdem verwenden kann. Dies wäre, wenn es nötig ist, dass beide ausdrücke ausgewertet werden (z.B. wenn es sich um Funktionen handelt, die beide ausgeführt werden sollen). Allerdings sind solche Fälle sehr selten und normalerweise auch vermeidbar.
Bitoperationen
Als Bitoperatoren können ausschließlich And und Or genutzt werden (und Not und XOr, damit befasst sich dieses Tutorial aber nicht).
Wenn euch das folgende verwirrt, ignoriert es einfach. Das obere ist das, worauf ich mit dem Tutorial hinaus will, ich füge das nur der Vollständigkeit halber bei.
Bei Bitoperationen werden die Operatoren gänzlich anders eingesetzt. Hierbei werden nicht Boolesche Ausdrücke miteinander verglichen, sondern Bits. Die Regeln sind aber gleich den logischen Operationen (wer sich auf Lowlevelebene mit Computern auseinandersetzt weiß, dass das eine aus dem anderen resultiert, darauf werde ich aber hier nicht eingehen um anfängerfreundlich zu bleiben). 1 steht für True und 0 für False:
Siehe auch ODER und UND für eine Nähere Erklärung.
Häufiger Anwendungszweck von Bitoperatoren sind Enumerationen, die mit
Ich hoffe ich habe mich verständlich genug ausgedrückt und konnte damit die Unklarheit einiger Leute klären.
Wenn ich etwas vergessen habe oder ihr sonst irgendwelche Verbesserungsvorschläge habt nur her damit.
Oft sehe ich im Forum Anfänger, die in If-Abfragen o.ä. die Operatoren And und Or verwenden, häufig werden dann die Operatoren AndAlso und OrElse in den Raum geworfen.
Mit diesem kleinen Tutorial möchte ich einmal klar stellen, was der Unterschied ist und wo man was verwendet.
Grundsätzlich sollten bei logischen Operationen immer AndAlso und OrElse verwendet werden. Warum werde ich anhand eines kleinen Beispiels zeigen. Auch wenn die Operatoren And und Or funktionieren ist ihre Funktionsweise eigentlich eine andere (siehe Bitoperatoren) und die logischen Eigenschaften sind nur eine "Nebenerscheinung".
Auf den ersten Blick scheinen diese zwei If-Abfragen genau dasselbe zu tun, führt man den Code jedoch aus wird folgendes passieren:
Die erste Abfrage wird einfach übersprungen, die zweite wird aber eine NullReferenceException werfen. Das liegt am unterschiedlichen Verhalten von And und AndAlso, welches ich nun näher beschreiben werde.
Verhalten von And:
Wenn die Ausführung das And erreicht wird zuerst die erste Bedingung geprüft, in diesem Fall
tb IsNot Nothing
. Dies wird selbstverständlich zu False
ausgewertet, da wir vorher keine Instanz erstellt haben. Nun prüft And die zweite Bedingung, das wäre tb.Text = String.Empty
. Das geht gewaltig schief, denn wir haben ja gerade schon festgestellt, dass tb nicht instanziert ist und somit auch keine Text-Eigenschaft abgerufen werden kann. Hier fliegt unsere Exception.Verhalten von AndAlso:
Wie beim And wertet AndAlso zuerst die erste Bedingung aus. AndAlso geht nun aber intelligenter vor. Da beide Bedingungen bei einer Und-Verknüpfung wahr sein müssen, die erste Bedingung aber falsch ist, gibt AndAlso gleicht
False
zurück und lässt die zweite Bedingung unbeachtet. Somit wird keine Text-Eigenschaft abgerufen und es gibt auch keine Exception.Selbes gilt auch für OrElse. Sobald die erste Bedingung wahr ist wird bereits
True
zurückgegeben, da nur eine der beiden Bedingungen wahr sein muss.Durch dieses spezielle Verhalten wird erstens die Performance erhöht und zweiten lassen sich Fehler leichter vermeiden (wie oben). Hätte man das ganze mit And programmieren wollen, so hätte man dies tun müssen:
Deutlich sperriger als mit AndAlso, wie ich finde.
Wenn man also mit AndAlso und OrElse arbeitet sollte man immer darauf achten die Bedingungen so aufzureihen, dass ein Ergebnis möglichst früh erhalten werden kann, also Bedingungen, die wahrscheinlicher zu einem vorzeitigen Abbruch führen, weiter vorn. Auch muss man auf die richtige Reihenfolge achten, wenn man solche Fehleranfälligen Bedingungen wie oben hat.
Es gibt eine Ausnahme, bei der man And und Or als logische Operanden trotzdem verwenden kann. Dies wäre, wenn es nötig ist, dass beide ausdrücke ausgewertet werden (z.B. wenn es sich um Funktionen handelt, die beide ausgeführt werden sollen). Allerdings sind solche Fälle sehr selten und normalerweise auch vermeidbar.
Als Bitoperatoren können ausschließlich And und Or genutzt werden (und Not und XOr, damit befasst sich dieses Tutorial aber nicht).
Wenn euch das folgende verwirrt, ignoriert es einfach. Das obere ist das, worauf ich mit dem Tutorial hinaus will, ich füge das nur der Vollständigkeit halber bei.
Bei Bitoperationen werden die Operatoren gänzlich anders eingesetzt. Hierbei werden nicht Boolesche Ausdrücke miteinander verglichen, sondern Bits. Die Regeln sind aber gleich den logischen Operationen (wer sich auf Lowlevelebene mit Computern auseinandersetzt weiß, dass das eine aus dem anderen resultiert, darauf werde ich aber hier nicht eingehen um anfängerfreundlich zu bleiben). 1 steht für True und 0 für False:
Siehe auch ODER und UND für eine Nähere Erklärung.
Häufiger Anwendungszweck von Bitoperatoren sind Enumerationen, die mit
<Flags()>
msdn.microsoft.com/en-us/library/system.flagsattribute.aspx gekennzeichnet wurden. Ein Beispiel dafür sind die ControlStyles:Ich hoffe ich habe mich verständlich genug ausgedrückt und konnte damit die Unklarheit einiger Leute klären.
Wenn ich etwas vergessen habe oder ihr sonst irgendwelche Verbesserungsvorschläge habt nur her damit.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Artentus“ ()