VB.NET AndAlso
Inhaltsverzeichnis
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
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 WeatherSensor–Klasse 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 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.
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:
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