VB.NET AndAlso

VB.NET AndAlso
VB.NET AndAlso

VB.NET AndAlso

Du möchtest mehr über den VB.NET AndAlso Operator lernen und verstehen wie Er funktioniert?

In diesem Beitrag zeige ich Dir einige Bespiele des VB.NET AndAlso Operators und erkläre Dir die Vorteile wie z. B. die Performance bezogenen Aspekte.

Vielleicht interessieren Dich z. B. auch noch folgende Beiträge: Application Path, PDF Öffnen, oder Button Click auslösen.

Vorarbeit – Wetter-Sensor

Wetter-Sensor Sonne Regen
Wetter-Sensor Sonne Regen

Um das VB.NET AndAlso Beispiel klarer zu gestalten, leisten wir ein wenig Vorarbeit, indem wir eine kleine WetterSensor-Klasse bauen.

Keine Sorge, dabei wir es sich um relativ stupide Daten ohne jegliche Anbindung einer API handeln.

Die Sensor-Klasse dient letztendlich nur der einfacheren Visualisierung und dem Verständnis hinter den Kulissen.

Achtung – Textbox-Referenz

Ich verwende hier beabsichtigt eine Referenz zur Log-Textbox, normalerweise sollte man dies nicht tun.

Mein Ziel ist es aber, das Beispiel so einfach wie möglich zu halten und Dir irgendwelche Handler zu ersparen.

Die Sensor-Klasse soll also beabsichtigt direkt in die Textbox loggen und somit eine direkte Abhängigkeit zu Ihr besitzen.

WeatherSensor-Klasse

An diesem Punkt stelle ich kurz die WeatherSensorKlasse vor:

Public Class WeatherSensor

    Public Property TbLog As TextBox

    Sub New(tbLog As TextBox)
        Me.TbLog = tbLog
    End Sub

    Public Async Function IsSunny() As Task(Of Boolean)
        Log($"{NameOf(IsSunny)}()")
        Await ConnectToSensor()
        Await DisconnectFromSensor()
        Return False
    End Function

    Public Async Function IsRaining() As Task(Of Boolean)
        Log($"{NameOf(IsRaining)}()")
        Await ConnectToSensor()
        Await DisconnectFromSensor()
        Return True
    End Function

    Private Async Function ConnectToSensor() As Task
        Log($"{NameOf(ConnectToSensor)}()")
        Await Task.Delay(1000)
        Log("Connected to sensor")
        Log("------")
    End Function

    Private Async Function DisconnectFromSensor() As Task
        Log($"{NameOf(DisconnectFromSensor)}()")
        Await Task.Delay(1000)
        Log("Disconnected from sensor")
        Log("------")
    End Function

    Private Sub Log(txt As String)
        TbLog.AppendText($"[{Now:HH:mm:ss}] {txt}{Environment.NewLine}")
    End Sub

End Class

Eigenschaften

TbLog

Hier speichern wir die Referenz, um direkt aus der Klasse loggen zu können (bitte Hinweise beachten).

Konstruktoren

new(TextBox)

Der erste und einzige Konstruktor der Klasse benötigt die Referenz zur Log-Textbox.

Methoden

IsSunny

Eine Funktion um festzustellen, ob es aktuell sonnig ist.

Im Hintergrund müssen wir uns natürlich – simuliert – zum Sensor verbinden, etc.

IsRaining

Mit dieser Funktion stellen wir fest, ob es aktuell regnet (die Intensität spielt hier keine Rolle).

Auch hier muss im Hintergrund natürlich eine „Verbindung hergestellt“ werden.

ConnectToSensor

Simuliert eine Verbindung zum Sensor aufzubauen.

DisconnectFromSensor

Tut so, als ob die Instanz sich vom Sensor trennen würde.

Log(String)

Eine Hilfsfunktion um Daten direkt in die Textbox zu loggen (bitte auch hier Hinweise beachten!).

Grafische Oberfläche

Für unser „VB.NET AndAlso„-Beispiel kannst Du Dir am besten die folgende, oder eine ähnliche Oberfläche zusammenklicken:

VB.NET AndAlso GUI
VB.NET AndAlso GUI

VB.NET And – der linke Button

Zuerst einmal schauen wir uns an, wie man das normale „And„, also den normalen And-Operator verwendet.

Wie schon angepriesen verwenden wir dafür die erstellte WetterSensor-Klasse, um eine sinnvoll gestützte Basis zu haben.

Doppelklicke den linken Button und füge den folgenden Code ein (vergiss nicht die Sub als Async zu deklarieren):

    Private Async Sub btnCheckWeatherByAnd_Click(sender As Object, e As EventArgs) Handles btnCheckWeatherByAnd.Click
        tbLog.Clear()
        Dim isNiceWeather = Await WeatherSensor.IsSunny() And Await WeatherSensor.IsRaining()
        ' do something
    End Sub

Im ersten Schritt löschen wir den aktuellen Inhalt des Logs, damit wir bei jedem Durchgang einen sauberen Start haben.

Dann legen wir eine Variable fest, worin wir das boolesche Ergebnis des einfachen „And“-Operators speichern.

Letztendlich ist für uns hier nur das Ergebnis im Log relevant, um zu überprüfen, was, wie und wann passiert ist.

VB.NET And Wetter-Sensor Log Ausgabe
VB.NET And Wetter-Sensor Log Ausgabe

Wir können im Log beobachten, dass beide Funktionen (IsSunny und IsRaining) unabhängig vom ersten Ergebnis aufgerufen werden.

Bei einer „Verundung“ müssen alle Bestandteile True ergeben, damit letztendlich das Ergebnis den Wert True erhält.

Trotz des „False„-Wertes, also trotz des Ausschlusses, dass der erste Wert überhaupt True sein kann, wird die zweite Funktion „IsRaining“ aufgerufen!

Das dies natürlich absolut sinnlos ist, liegt auf der Hand, doch wie verhindern wir das?

Nicht nur die sinnlosen Verbindungsversuche der Klasse zum Sensor stoßen hier übel auf.

Ebenso stören auch die dabei verschwendeten Ressourcen und die sinnlose Warterei.

VB.NET AndAlso – der rechte Button

Schauen wir uns als nächstes die Vorgehensweise im rechten Button an:

    Private Async Sub btnCheckWeatherByAndAlso_Click(sender As Object, e As EventArgs) Handles btnCheckWeatherByAndAlso.Click
        tbLog.Clear()
        Dim isNiceWeather = Await WeatherSensor.IsSunny() AndAlso Await WeatherSensor.IsRaining()
    End Sub

Dir wird vermutlich schnell auffallen, dass der Code im Handler des zweiten Buttons nur ein anderes Wort enthält.

Statt des „And„-Operators verwenden wir hier den „AndAlso„-Operator und verändern somit die Verhaltensweise.

Werfen wir nun das zweite Mal einen Blick auf das Log:

VB.NET AndAlso Wetter-Sensor Log Ausgabe
VB.NET AndAlso Wetter-Sensor Log Ausgabe

Nun können wir mit glücklicher Miene feststellen, dass nur die „IsSunny„-Funktion aufgerufen wird und die „IsRaining“-Funktion außen vor bleibt.

Somit finden keine unnötigen Verbindungsversuche und auch keine Verschwendung von Ressourcen statt, SUPER!

Kompletter Code – VB.NET AndAlso

Public Class Form1

    Private ReadOnly WeatherSensor As WeatherSensor

    Sub New()
        InitializeComponent()
        WeatherSensor = New WeatherSensor(tbLog)
    End Sub

    Private Sub btnClearLog_Click(sender As Object, e As EventArgs) Handles btnClearLog.Click
        tbLog.Clear()
    End Sub

    Private Async Sub btnCheckWeatherByAnd_Click(sender As Object, e As EventArgs) Handles btnCheckWeatherByAnd.Click
        tbLog.Clear()
        Dim isNiceWeather = Await WeatherSensor.IsSunny() And Await WeatherSensor.IsRaining()
    End Sub

    Private Async Sub btnCheckWeatherByAndAlso_Click(sender As Object, e As EventArgs) Handles btnCheckWeatherByAndAlso.Click
        tbLog.Clear()
        Dim isNiceWeather = Await WeatherSensor.IsSunny() AndAlso Await WeatherSensor.IsRaining()
    End Sub

End Class

Public Class WeatherSensor

    Public Property TbLog As TextBox

    Sub New(tbLog As TextBox)
        Me.TbLog = tbLog
    End Sub

    Public Async Function IsSunny() As Task(Of Boolean)
        Log($"{NameOf(IsSunny)}()")
        Await ConnectToSensor()
        Await DisconnectFromSensor()
        Return False
    End Function

    Public Async Function IsRaining() As Task(Of Boolean)
        Log($"{NameOf(IsRaining)}()")
        Await ConnectToSensor()
        Await DisconnectFromSensor()
        Return True
    End Function

    Private Async Function ConnectToSensor() As Task
        Log($"{NameOf(ConnectToSensor)}()")
        Await Task.Delay(1000)
        Log("Connected to sensor")
        Log("------")
    End Function

    Private Async Function DisconnectFromSensor() As Task
        Log($"{NameOf(DisconnectFromSensor)}()")
        Await Task.Delay(1000)
        Log("Disconnected from sensor")
        Log("------")
    End Function

    Private Sub Log(txt As String)
        TbLog.AppendText($"[{Now:HH:mm:ss}] {txt}{Environment.NewLine}")
    End Sub

End Class

Downloads

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.