Warum man AndAlso/OrElse in VB.Net verwenden sollte…

VB.Net hat neben den Operatoren And und Or auch die Operatoren AndAlso und OrElse. Diese werden auch als Kurzschluss-Operatoren bezeichnet. Der Unterschied zwischen den Operatoren ist, dass AndAlso und OrElse die Überprüfung abbrechen, sobald das Ergebnis klar ist.

Ich wusste lange nicht, dass es für diesen Zweck extra Operatoren gibt und dachte, dass dieses Verhalten der Standard ist. Und meiner Meinung nach, sollte es der Standard sein. Denn wenn der erste Teil einer And-Bedingung False ist, dann ist das Ergebnis des zweiten Teils irrelevant für das Gesamtergebnis der Bedingung. Warum sollte man also besser immer AndAlso und OrElse verwenden?

Punkt 1: Performance.
Da bereits nach der ersten Bedingung einer If-Bedingung das Ergebnis bekannt sein kann, müssen die anderen Prüfungen nicht mehr durchgeführt werden. Gerade wenn in der Überprüfung beispielsweise Datenbankzugriffe ausgeführt werden, kann viel Performance gespart werden. Aber auch bei kleinen Prüfungen kann Performance gespart werden. Nämlich dann, wenn viele kleinen Überprüfungen nicht mehr ausgeführt werden.

Punkt 2: Subtile Bugs (Unoffensichtliches Verhalten)
Das der zweite Teil eine And-Bedingung auch ausgeführt wird, wenn der erste Teil False war, ist nicht offensichtlich und verleitet zu Fehlern. Deshalb sollte immer AndAlso und OrElse verwendet werden. Ein Beispiel:

Private Function Test(obj As Object) As Boolean
    If obj Is Nothing Then
        Throw New NullReferenceException("Objekt nicht gesetzt.")
    End If
    
    Return True
End Function

Public Sub Main()
    Dim obj As Object = Nothing
    If obj IsNot Nothing And Test(obj) Then
        Console.WriteLine("Okay.")
    End If
End Sub

Die Methode Test wirft eine Exception, wenn die Übergabe Nothing ist. Dies simuliert eine Funktion, welche die Übergabe von Nothing nicht verträgt. Um Fehler direkt abzufangen wird die Variable auf Nothing geprüft und die Methode Test mit der Variablen aufgerufen. Die Ausführung von Main wirft die NullReferenceException, weil der zweite Block ausgeführt wird. Nicht sehr intuitiv. Schreibt man die Main-Methode aber so:

Public Sub Main()
    Dim obj As Object = Nothing
    If obj IsNot Nothing AndAlso Test(obj) Then
        Console.WriteLine("Okay.")
    End If
End Sub

Dann funktioniert es, wie erwartet, indem die Funktion Test nicht ausgeführt wird.

Meine Empfehlung ist also AndAlso und OrElse immer zu verwenden, um solche Bugs zu umgehen und um, wenigstens ein wenig, mehr Performance aus den eigenen Programmen zu holen.

Advertisements
Dieser Beitrag wurde unter Coding abgelegt und mit verschlagwortet. Setze ein Lesezeichen auf den Permalink.

2 Antworten zu “Warum man AndAlso/OrElse in VB.Net verwenden sollte…

  1. Stellt sich noch die Frage, wozu man die AND-Bedingung alleine noch braucht. Ich setze fast ausschliesslich ANDALSO ein, die Argumente oben kann ich unterschreiben. Alternativen sind verschachtelte If-Bedingungen, die das Leben nicht leichter machen.

    Der Zugriff auf ein Objekt-Attribut sollte tatsächlich immer mit einer vorherigen Prüfung auf NOT NOTHING und einer ANDALSO Verknüpfung einhergehen. Ist aber leider (organisatorisch) überflüssiger Code; es ärgert mich schon lange, dass man die Objekte auf Nothing prüfen muss, bevor man auf ein Attribut des Objekts gesichert zugreifen kann. Warum kann .net das nicht handeln, als wäre das ganze einfach nothing? Das würde Millionen aufrufe a la „If meinDing is not Nothing andalso“ sparen.

    • Vielen Dank für deinen Kommentar.

      Die Alternative zum dauernden Prüfen auf Nothing ist ein Muster namens Null-Objekt. Dabei geht es im Grunde darum, dass kein Nothing benutzt wird. Stattdessen werden Objekte benutzt, die das ungültige Objekt repräsentieren. Ein einfaches Beispiel ist eine leere Liste. Anstatt Nothing wird, wenn nichts gefunden wird, eine leere Liste zurück gegeben.

      Ich denke dazu kann ich noch einen ausführlichen Post mit Beispielen erstellen. Weil man sich durch dieses Muster viele Prüfungen auf Nothing ersparen kann.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s