In this article I will explain you about Enumerators in VB.NET.
As explained earlier, VB.NET has a new iteration syntax called foreach. The foreach statement can only be applied to objects of classes that implement the IEnumerable interface. The IEnumerable interface exposes the enumerator, which supports a simple iteration over a collection. Enumerators are intended to be used only to read data in the collection and cannot be used to modify the underlying collection. The enumerator does not have exclusive access to the collection. To understand what happens in the background, consider the code snippet in Listing 5.57.
Listing 5.57: Enumerator Example 1
For Each i As Integer In a
This code functions just like the while loop used in Listing 5.58.
Listing 5.58: Enumerator Example 2
a = x.GetEnumerator()
Before entering the statement block, the compiler generates the code to call the method GetEnumerator of the object passed as the second parameter in the foreach statement. The GetEnumerator method must return an object, having a property named Current, of type similar to the first argument of the foreach statement. Also this object must have a MoveNext method of return type bool. This method informs the runtime when to terminate the loop.
When an enumerator is instantiated, it takes a snapshot of the current state of the collection. If changes are made to the collection, such as the addition, modification, or deletion of elements, the snapshot gets out of sync and the enumerator throws an InvalidOperationException. Two enumerators instantiated from the same collection simultaneously can have different snapshots of the collection.
If the enumerator is positioned before the first element in the collection or after the last element in the collection, the enumerator is in an invalid state. In that case, calling Current throws an exception.
The enumerator is positioned before the first element in the collection initially. The Reset function brings the enumerator back to this position. The MoveNext method must be called to advance the enumerator to the first element of the collection before reading the value of Current, after an enumerator is created or after a Reset. The Current property returns the same object until either MoveNext or Reset is called.
Once the end of the collection is passed, the enumerator is in an invalid state and calling MoveNext returns false.
Calling Current throws an exception if the last call to MoveNext returned false. With this information under your belt, you should insert your enumerating code inside a try-catchfinally block to prevent unexpected exits.
Hope this article would have helped you in understanding Enumerators in VB.NET.