Visual Basic .NET: Optionen
Man kann das Verhalten von Visual Basic mit sogenannten Optionen beeinflussen. Insgesamt gibt es drei verschiedene Optionen: Explicit, Strict und Compare.
Typisierung
[Bearbeiten]In den letzten Kapiteln hatten Sie viel mit der sogenannten Typisierung zu tun, wahrscheinlich ohne es gemerkt zu haben. Typisierung bedeutet, dass ein Wert immer an einen bestimmten Datentyp gebunden ist. So kann leicher überprüft werden, ob Sie mit den Werten nur das machen, was Sie damit machen können. Zwei String-Werte können Sie verketten, zwei Long-Werte nicht. Dafür können Sie die String-Werte nicht miteinander multiplizieren, die Long-Werte schon. Die Typisierung in Visual Basic .NET ist:
- stark - Die Datentypen sind klar voneinander getrennt, Sie können einen Long-Wert nicht einfach einer Single-Variablen zuweisen, denn dazu muss der Long-Wert erst in Single konvertiert werden. Da diese Konvertierung aber meist automatisch, da implizit, geschieht, kann man nicht von wirklich starker Typisierung, sondern eigentlich nur von halbstarker Typisierung sprechen.
- statisch - Schon bei der Kompilierung steht fest, welcher Wert und welche Variable wann welchen Datentyp haben wird.
- explizit - Sie müssen für jeden Wert und jede Variable selber festlegen, welcher Datentyp er hat. (Bei Variablen geschieht das bei der Deklaration, bei Literalen entweder implizit über die Standarddatentypen oder explizit über Literalsuffixe.)
Die Typisierung können Sie mit den Optionen Explicit und Strict in einem gewissen Rahmen beeinflussen.
Option Explicit
[Bearbeiten]Die Option Explicit kann entweder On (an) oder Off (aus) sein. Standardmäßig ist sie angeschaltet, d.h. die Typisierung ist explizit (s.o.). Schaltet man die Option Explicit auf Off, so wird das Typisierungsverhalten hybrid implizit und explizit. Implizite Typisierung bedeutet, dass Variablen bei der ersten Verwendung automatisch (implizit) deklariert werden. Mit „hybrid“ meine ich, dass man Variablen sowohl explizit mit der Dim-Anweisung deklarieren kann oder sie implizit bei der ersten Verwendung deklarieren lassen können.
Achtung: Implizit deklarierte Variablen haben immer den Typ Object, der jeden möglichen Wert annehmen kann. Einfach ausgedrückt hat der auf der Variable gespeicherte Wert aber einen eigenen Typ, wie das folgende Beispiel zeigt. Das folgende Codebeispiel ist nur mit ausgeschalteter Option Explicit gültig, da Variablen dann nicht explizit deklariert werden müssen.
Die Variable a wird bei der ersten Verwendung automatisch als Object-Variable deklariert. Der nach der ersten Anweisung gespeicherte Wert (3) ist vom Typ Integer. In der zweiten Zeile wird die Object-Variable b deklariert. Der gespeicherte Wert ist der Rückgabewert der Verkettungsoperation, also ein Wert vom Typ String. (Beachten Sie, dass der auf a gespeicherte Wert für die Verkettungsoperation von Integer nach String konvertiert wird.) Beachten Sie, dass man auf einer Object-Variablen wirklich zu jeder Zeit jeden möglichen Wert speichern kann. Im Beispiel kann man, nachdem man die Variable a mit dem Integer-Wert 3 initialisiert hat, auf derselben Variable etwa einen String- oder Boolean-Wert speichern.
Doch wie deaktiviert man diese ominöse Option Explicit, falls man die implizite Variablendeklaration nutzen möchte? Ganz einfach: Im Code setzen Sie ganz am Anfang, also noch vor die Zeile Private Class ..., diese Zeile.
Das erste Wort Option leitet die Optionsschalteranweisung ein, das zweite Wort Explicit gibt den Optionsschalter ein, und das letzte Wort Off die neue Einstellung. Mit Option Explicit On können Sie die implizite Variablendeklarierung explizit verbieten, das ist aber meist nicht nötig, außer wenn Sie, wie in manchen Entwicklungsumgebungen möglich, den Explicit-Optionsschalter global, also für alle Dateien, auf Off stellen.
Nun, wo Sie wissen, wie man die Option Explicit benutzt: Benutzen Sie sie nicht. Implizite Variablendeklaration ist ein Relikt aus Ur-BASIC-Zeiten und wird heute nur noch in Skriptsprachen angewandt. Für Applikationsprogrammierung wie in VB.NET ist die explizite Variablendeklaration definitiv die bessere Wahl:
- Explizit deklarierte Variablen erlauben eine größere Kontrolle über den Datentyp der gespeicherten Werte. Auf einer Object-Variable kann immer alles gespeichert werden. Vor allem bei tief verschachtelten Funktionsaufrufen geht da schnell die Übersicht verloren, was für ein Wert gerade gespeichert ist. Unvorsichtige Operationen lösen dann schnell einen Fehler aus.
- Impliziert deklarierte Variablen stellen eine häufige Fehlerquelle dar. Falls Sie sich nämlich bei einem Variablennamen vertippen, wird, anstatt die gewünschte Variable zu verwenden, eine neue Variable angelegt.
- Mit impliziert deklarierten Variablen erschweren Sie sich selber die Nutzung der Memberreferenzierung, eines der größten Vorteile der objektorientierten Programmierung.
Verwenden Sie deshalb immer nur explizit deklarierte Variablen. Die Erfahrung hat gezeigt, dass man alles ohne implizit deklarierte Variablen programmieren kann, meistens sogar effektiver.
Option Strict
[Bearbeiten]Auch die Strict-Option kann On oder Off sein. Anders als die Explicit-Option ist sie standardmäßig abgeschaltet, also Off. Ist die Strict-Option angeschaltet, ist die implizite Typumwandlung verboten. Sie müssen dann eine der expliziten Typumwandlungsfunktionen einsetzen, egal ob es eine C-Funktion, eine Parse-Funktion oder eine andere Funktion ist. Das folgende Beispiel ist bei aktivierter Strict-Option falsch.
Der Wert des Literals 4 ist Integer. Die MessageBox.Show-Funktion erfordert allerdings einen Parameter vom Typ String. Da mit eingeschalteter Strict-Option die implizite Typumwandlung deaktiviert ist, tritt deshalb ein Fehler auf. Mit einer expliziten Typumwandlung lässt sich das Problem lösen.
Hier wird zuerst durch die CStr-Funktion der Literal von Integer (4) nach String ("4") konvertiert. Dieser Wert hat den korrekten Datentyp und kann ausgegeben werden. Die Option Strict zu aktivieren, ist eine gute Idee, wenn man einen Fehler in einer Funktion sucht. Die durch die deaktivierte implizite Typumwandlung verursachten Fehler stellen nämlich gute Hinweisquellen dar.
Option Compare
[Bearbeiten]Die Compare-Option unterscheidet sich in einigen Punkten von den bisher vorgestellten Optionen: Erstens geht es hier nicht um das Typisierungsverhalten, sondern um das Operationsverhalten, genauer das der Vergleichsoperationen. Zweitens sind die möglichen Schalterzustände hier nicht On oder Off, sondern Text oder Binary.
Mit der Compare-Option schalten Sie die Sortierung um, nach der die Vergleichsoperatoren Strings miteinander vergleichen.
Option Compare Binary
[Bearbeiten]Mit diesem Schalterzustand werden Zeichen nach ihrem Zeichensatzindex eingeordnet. (Ein Zeichensatz ist eine Tabelle, die bestimmte Zeichengruppen mit Indizes versieht, die anstatt der Zeichen abgespeichert werden. Schließlich kann man Zahlen leichter speichern als Zeichen.) Der Zeichensatz hängt vom System ab. Am wahrscheinlichsten sind ISO-8859-1 und Unicode, auf fremdsprachigen Systemen mit anderen Alphabeten (kyrillisch, arabisch, etc.) hat man es oft mit ISO-8859-Zeichensätzen zu tun.
Die Basis für fast alle heutigen Zeichensätze stellt der ASCII-Zeichensatz dar. Er definiert 128 Zeichen (Indices 0 - 127). Die ersten 32 Zeichen (Indices 0 - 31) sind Steuerzeichen wie „Zeilenvorschub“ oder „Tabulator“. Auf Index 32 liegt das Leerzeichen. Auf Index 127 liegt das DEL-Steuerzeichen, welches nur in der Zeit von Fernschreibern von Bedeutung war. Von Index 33 bis Index 126 finden Sie in dieser Reihenfolge folgende Zeichen:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Bei der Binary-Einstellung, die übrigens die Standardeinstellung für die Compare-Option ist, wird alphabetisch verglichen, wobei die obige Darstellung das Alphabet ist. Also ist „!“ kleiner als „#“, „1“ kleiner als „3“ und „g“ größer als „H“ (obwohl das nicht der Reihenfolge im normalen Alphabet entspricht). Sie sehen, alles wird nach der Reihenfolge im Zeichensatz sortiert, die, vor allem bei Vergleichen eines Klein- mit einem Großbuchstaben, nicht immer der Reihenfolge im Alphabet entspricht.
Kurzbeispiel: A < C < T < a < c < t
Option Compare Text
[Bearbeiten]Bei der Text-Einstellung wird vorrangig nach dem Alphabet und erst zweitrangig nach der Reihenfolge im Zeichensatz sortiert. Die intuitive Sortierung nach dem Alphabet funktioniert also wieder. „g“ ist zum Beispiel kleiner als „H“, da „g“ im Alphabet vor „H“ steht.
Kurzbeispiel: (A = a) < (C = c) < (T = t)
Beachten Sie, dass die Sortierart nicht nur für Vergleichsoperatoren gilt, sondern auch für andere Funktionen, die einen Vergleich von Werten anstellen können, etwa die Array.Sort-Funktion.