|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
23.4.1. Strongly Typed IEnumerable(Of T) en IEnumerator(Of T)Er zijn ook strongly typed versies van de IEnumerable en IEnumerator interfaces.
Namelijk System.Collections.Generic.IEnumerable(Of T) : Interface IEnumerable(Of T) : Inherits IEnumerable Function GetEnumerator() As IEnumerator(Of T) End Interface En System.Collections.Generic.IEnumerator(Of T) : Interface IEnumerator(Of T) : Inherits IEnumerator, IDisposable ReadOnly Property Current() As T End Interface Bestudeer de topics over generics en disposing voor een goed begrip van volgend voorbeeld.
In onderstaand voorbeeld creëren we een typesafe BoundedQueue ( voor het beheren van Integer waardes ) met een strongly typed enumerator : Visual Basic 2010 Broncode Option Strict OnImports System.Collections.Generic Namespace Example Class BoundedQueue : Implements IEnumerable( Of Integer) Protected m_Items As Integer() Protected m_Count As Integer Public Sub New( ByVal capacity As Integer) ReDim m_Items(capacity - 1) End Sub Public ReadOnly Property Count() As Integer Get Count = m_Count End Get End Property Public ReadOnly Property Capacity() As Integer Get Capacity = m_Items.Length End Get End Property Public Sub Enqueue( ByVal value As Integer) If Count < Capacity Then m_Items(Count) = value m_Count += 1 End If End Sub Public Function Peek() As Object Peek = m_Items(0) End Function Public Sub Dequeue() For index As Integer = 0 To Count - 2 m_Items(index) = m_Items(index + 1) Next m_Items(Count - 1) = 0 m_Count -= 1 End Sub Private Function getObjectEnumerator() As IEnumerator _ Implements IEnumerable. GetEnumerator getObjectEnumerator = GetEnumerator() End Function Public Function GetEnumerator() As Generic. IEnumerator( Of Integer) _ Implements Generic. IEnumerable( Of Integer).GetEnumerator GetEnumerator = New BoundedQueueEnumerator(m_Items, Count) End Function Private Class BoundedQueueEnumerator Implements IEnumerator( Of Integer) Private m_Items As Integer() Private m_Count As Integer Private m_Cursor As Integer = -1 Public Sub New( ByVal items As Integer(), ByVal count As Integer) m_Items = items m_Count = count End Sub Public Function MoveNext() As Boolean _ Implements IEnumerator. MoveNext m_Cursor += 1 MoveNext = (m_Cursor < m_Count) End Function Public Sub Reset() Implements IEnumerator. Reset m_Cursor = -1 End Sub Private ReadOnly Property currentObject() As Object _ Implements IEnumerator. Current Get currentObject = Current End Get End Property Public ReadOnly Property Current() As Integer _ Implements Generic. IEnumerator( Of Integer).Current Get Current = m_Items(m_Cursor) End Get End Property# Region " IDisposable Support " Private disposedValue As Boolean = False Protected Overridable Sub Dispose( ByVal disposing As Boolean) If Not Me.disposedValue Then If disposing Then End If End If Me.disposedValue = True End Sub Public Sub Dispose() Implements IDisposable. Dispose Dispose( True) GC.SuppressFinalize( Me) End Sub# End Region End Class End Class Class Client Public Shared Sub Main() Dim boundedQueue1 As New BoundedQueue(3) boundedQueue1.Enqueue(1) boundedQueue1.Enqueue(2) boundedQueue1.Enqueue(3) boundedQueue1.Enqueue(4) For Each element As Integer In boundedQueue1 Console.Write(element.ToString() & " ") Next Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 1 2 3 Om het voorbeeld eenvoudig te houden is hier een niet robuuste iterator gedefinieerd.
Zelfs met strict type semantics ( Option Strict On ) is het mogelijk de element variabele van de For Each ... Next iteratie van het type Integer te declareren.
Het cleanup-pattern ( region " IDisposable Support " ) hoeft hier geen verdere implementatie. Er zijn hier bijvoorbeeld geen schaarse resources die we vrij moeten geven, geen databaseconnecties of streams die we moeten sluiten en geen unmanaged resources die we moeten vrijgeven. Visual Studio : De members uit de region " IDisposable Support " worden automatisch toegevoegd indien je aangeeft een generische instantie van IEnumerator(Of T) te implementeren.
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|