Unterschied zwischen "And" und "AndAlso"

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Ein Verwendungszweck des AndAlso-Operators besteht darin, das Vorhandensein einer Objektinstanz zu testen, bevor der Zugriff auf einen ihrer Member versucht wird. Die folgende Codezeile veranschaulicht dies.
    If newObject AndAlso newObject.initFinished Then
    Durch den Zugriff auf die initFinished-Eigenschaft in der obigen Codezeile kann eine NullReferenceException-Ausnahme ausgelöst werden, wenn der newObject-Variablen keine Objektinstanz zugewiesen war. Der AndAlso-Operator bewirkt jedoch, dass der Compiler den Zugriff auf initFinished umgeht, wenn newObject den Wert Nothing hat, da NothingFalse ergibt.
    Datentypen

    Der AndAlso-Operator wird nur für den Boolean-Datentyp (Visual Basic) definiert. Visual Basic konvertiert jeden Operanden je nach Bedarf in Boolean-Werte und führt die Operation ganz als Boolean aus. Wenn Sie das Ergebnis einem numerischen Typ zuweisen, konvertiert Visual Basic es vom Boolean-Typ in diesen Typ. Dies kann zu unerwartetem Verhalten führen. Bei der Konvertierung in Integer ergibt 5 AndAlso 12 z. B. –1.
    Überladen

    Der And-Operator (Visual Basic) und der IsFalse-Operator können überladen werden. Das bedeutet, dass eine Klasse oder Struktur ihr Verhalten neu definiert, wenn ein Operand den Typ dieser Klasse oder Struktur aufweist. Das Überladen des And-Operators und des IsFalse-Operators beeinflusst das Verhalten desAndAlso-Operators. Wenn im Code AndAlso für eine Klasse oder Struktur verwendet wird, die And und IsFalse überlädt, müssen Sie das neu definierte Verhalten der Operatoren kennen. Weitere Informationen finden Sie unter Operatorprozeduren.


    Quelle: msdn.microsoft.com/de-de/library/cb8x3kfz.aspx

    magerquark schrieb:

    Hab mir das von Mentras zitierte nicht komplett durchgelesen.
    Allerdings meinte ich gehört zu haben, dass bei AndAlso die zweite Bedingung nur dann geprüft wird, wenn die erste schon erfüllt ist.
    Steht nicht im Text von Microsoft.
    AndAlso ist zusammengefasst dafür da, um unbehandelte Fehler in If-Abfragen zu vermeiden.
    Man kann es auch andersherum erklären. als es noch kein AndAlso gab mußte man sowas

    VB.NET-Quellcode

    1. If (Not str Is Nothing) AndAlso str.length>0 Then ...

    so verkürzt umsetzen

    VB.NET-Quellcode

    1. If (Not str Is Nothing) Then If str.length>0 Then ...

    oder übersichtlicher so

    VB.NET-Quellcode

    1. If (Not str Is Nothing) Then
    2. If str.length>0 Then ...
    3. End If


    Wenn man letzteres versteht, versteht man auch AndAlso


    Ein weiters Beispiel um nochmal den Unterschied zu And aufzuzeigen:

    VB.NET-Quellcode

    1. If files Is Nothing AndAlso OpenFileDialog.ShowDialog() = DialogResult.OK Then files = OpenFileDialog.FileNames

    nur wenn files Nothing ist wird der OpenFileDialog aufgerufen und so fern mit OK abgeschlossen dann files die Datei(en) zugewiesen.


    VB.NET-Quellcode

    1. If files Is Nothing And OpenFileDialog.ShowDialog() = DialogResult.OK Then files = OpenFileDialog.FileNames

    hier würde sich der Dialog auch öffnen wenn Files nicht Nothing ist, zwar würde die If-Then-Bedingung nicht erfüllt werden und somit das Ergebnis letztlich gleich sein, aber der Effekt wäre unschön, ein Dialog zu öffnen zu lassen, in dem man sogar etwas auswählen kann, was dann aber sowieso nicht verwendet wird.