Der Unterschied zwischen And und AndAlso/Or und OrElse

    • VB.NET

    Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      Der Unterschied zwischen And und AndAlso/Or und OrElse

      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".

      VB.NET-Quellcode

      1. Dim tb As TextBox
      2. If tb IsNot Nothing AndAlso tb.Text = String.Empty Then
      3. End If
      4. If tb IsNot Nothing And tb.Text = String.Empty Then
      5. End If

      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:

      VB.NET-Quellcode

      1. If tb IsNot Nothing Then
      2. If tb.Text = String.Empty Then
      3. End If
      4. End If

      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:

      Quellcode

      1. 1 And 1 = 1
      2. 1 And 0 = 0
      3. 0 And 1 = 0
      4. 0 And 0 = 0
      5. 1 Or 1 = 1
      6. 1 Or 0 = 1
      7. 0 Or 1 = 1
      8. 0 Or 0 = 0
      9. Beispiel:
      10. 11010100 And 01010110 = 01010100
      11. 10100010 Or 01010100 = 11110110

      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:

      VB.NET-Quellcode

      1. SetStyle(ControlStyles.ResizeRedraw Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer, True)



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

      Vielleicht noch eine Anmerkung.
      AndAlso und OrElse sind keine Erfindung von .NET, obwohl sie erst im Rahmen von .NET der Sprache VB hinzugefügt wurden (VB6 kennt sie nicht).
      In C und in C++ und damit auch in C# gibt es die Unterscheidung dieser Operatoren schon "von Anbeginn":
      & - && <=> And - AndAlso
      und
      | - || <=> Or - OrElse.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!