In Visual Basic unterstützen Sammlungen (Arrays, Listen, Wörterbücher usw.) sowohl den Zugriff nach Index als auch mithilfe von Iteratoren (z. B. über For Each). In der Geschichte der Sprache hatte das erste Element eines Standardarrays den Index 0, jedoch gibt es aufgrund der Kompatibilität mit VB6 Arrays, die mit 1 deklariert sind. Dies beeinflusst die Zugriffreihenfolge und mögliche Fehler. Zudem unterstützen Sammlungen wie Dictionary die Suche nach Schlüsseln, jedoch kann der Versuch, auf ein nicht bestehendes Element zuzugreifen, zu einer Ausnahme führen.
Das Problem des Zugriffs besteht in den Unterschieden der Syntax, den Besonderheiten der Indizierer und der Tatsache, dass nicht alle Sammlungen null oder Nothing zurückgeben, wenn ein Element fehlt — häufig tritt eine Ausnahme auf. Bei der Verwendung von Schleifen ist es wichtig, den Indexbereich zu beachten und die Größe der Sammlung im Voraus zu überprüfen.
Eine Lösung für den sicheren Zugriff umfasst die Überprüfung der Längen, die Verwendung der Methoden ContainsKey oder TryGetValue für Wörterbücher sowie die Aufzählung von Elementen mithilfe von For Each, wobei der Zugriff auf bestehende Werte ohne Risiko, die Grenzen zu überschreiten, erfolgt.
Beispielcode:
Dim list As New List(Of String)({"a", "b", "c"}) For i As Integer = 0 To list.Count - 1 Console.WriteLine(list(i)) Next ' Iteration über den Iterator: For Each item In list Console.WriteLine(item) Next ' Sicherer Zugriff in Dictionary Dim dict As New Dictionary(Of Integer, String) dict(1) = "one" If dict.ContainsKey(2) Then Console.WriteLine(dict(2)) End If
Wichtige Merkmale:
Kann man auf ein Dictionary nach Index wie bei einem Array zugreifen?
Nein, Dictionary unterstützt den Zugriff nach numerischem Index nicht, sondern nur nach Schlüssel. Um die Schlüssel in Reihenfolge zu durchlaufen, muss man die Schlüsselkollektion erhalten:
For Each key In dict.Keys Console.WriteLine(dict(key)) Next
Was passiert, wenn man auf eine List außerhalb des Bereichs zugreift?
Es wird eine Ausnahme ArgumentOutOfRangeException ausgelöst. Überprüfen Sie immer, dass der Index kleiner als Count und größer oder gleich 0 ist.
Kann For Each Elemente überspringen, wenn die Sammlung während der Iteration geändert wird?
Ja, das Ändern der Sammlung innerhalb von For Each führt zu einer Ausnahme InvalidOperationException. Vermeiden Sie das Hinzufügen oder Entfernen von Elementen während der Iteration:
' Beispiel für einen Fehler For Each x In list list.Remove(x) ' Wirft eine Ausnahme Next
Anfänger haben Elemente in die List innerhalb der For Each-Schleife hinzugefügt, was dazu führte, dass die Anwendung wegen InvalidOperationException abstürzte.
Vorteile:
Vor dem Beginn der Iteration die Liste der Elemente in einem separaten Array speichern, mit einer Kopie arbeiten oder For mit einem Index verwenden. Zugriff auf Dictionary nur nach Überprüfung der Schlüsselaufruf.
Vorteile: