In Visual Basic, collections (arrays, lists, dictionaries, etc.) support access both by index and through iterators (e.g., using For Each). In the history of the language, the first element of a standard array has an index of 0, however, due to compatibility with VB6, there are arrays declared starting from 1. This affects the order of access and possible errors. Also, collections of the Dictionary type support key-based lookup, but attempting to access a non-existent element may lead to an exception being thrown.
The issue of access lies in the differences in syntax, the peculiarities of how indexers work, and the fact that not all collections return Null or Nothing when an element is absent—often an exception occurs. When using loops, it is important to adhere to the index range and to check the size of the collection in advance.
A solution for safe access includes checking the length, working with methods such as ContainsKey or TryGetValue for dictionaries, as well as enumerating elements using For Each, where access goes to existing values without the risk of going out of bounds.
Example code:
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 through iterator: For Each item In list Console.WriteLine(item) Next ' Safe access in Dictionary Dim dict As New Dictionary(Of Integer, String) dict(1) = "one" If dict.ContainsKey(2) Then Console.WriteLine(dict(2)) End If
Key features:
Can you access a Dictionary by index like an array?
No, a Dictionary does not support access by numerical index, only by key. To iterate keys in order, you need to get the collection of keys:
For Each key In dict.Keys Console.WriteLine(dict(key)) Next
What happens if you access a List by index out of range?
An ArgumentOutOfRangeException will be thrown. Always check that the index is less than Count and greater than or equal to 0.
Can For Each skip elements if the collection is changed during iteration?
Yes, modifying the collection within For Each leads to an InvalidOperationException. Avoid adding or removing elements during iteration:
' Example of error For Each x In list list.Remove(x) ' Will throw an exception Next
Novices added elements to a List inside a For Each loop, resulting in the application crashing with an InvalidOperationException error.
Pros:
Before starting iteration, save the list of elements to a separate array, work with a copy, or use For with an index. Access to Dictionary only after checking for key presence.
Pros: