IEnumerator<T> Interfaccia
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Supporta un'iterazione semplice su una raccolta generica.
generic <typename T>
public interface class IEnumerator : IDisposable, System::Collections::IEnumerator
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator where T : allows ref struct
public interface IEnumerator<T> : IDisposable, System.Collections.IEnumerator
type IEnumerator<'T> = interface
interface IEnumerator
interface IDisposable
type IEnumerator<'T> = interface
interface IDisposable
interface IEnumerator
Public Interface IEnumerator(Of Out T)
Implements IDisposable, IEnumerator
Public Interface IEnumerator(Of T)
Implements IDisposable, IEnumerator
Parametri di tipo
- T
Tipo di oggetti da enumerare.
Questo parametro di tipo è covariante, ovvero puoi usare il tipo specificato o qualsiasi tipo più derivato. Per altre informazioni sulla covarianza e la controvarianza, vedi Covarianza e controvarianza nei generics.- Derivato
- Implementazioni
Esempio
Nell'esempio seguente viene illustrata un'implementazione dell'interfaccia IEnumerator<T> per una classe di raccolta di oggetti personalizzati. L'oggetto personalizzato è un'istanza del tipo Boxe la classe di raccolta è BoxCollection. Questo esempio di codice fa parte di un esempio più ampio fornito per l'interfaccia ICollection<T> .
// Defines the enumerator for the Boxes collection.
// (Some prefer this class nested in the collection class.)
public class BoxEnumerator : IEnumerator<Box>
{
private BoxCollection _collection;
private int curIndex;
private Box curBox;
public BoxEnumerator(BoxCollection collection)
{
_collection = collection;
curIndex = -1;
curBox = default(Box);
}
public bool MoveNext()
{
//Avoids going beyond the end of the collection.
if (++curIndex >= _collection.Count)
{
return false;
}
else
{
// Set current box to next item in collection.
curBox = _collection[curIndex];
}
return true;
}
public void Reset() { curIndex = -1; }
void IDisposable.Dispose() { }
public Box Current
{
get { return curBox; }
}
object IEnumerator.Current
{
get { return Current; }
}
}
' Defines the enumerator for the Boxes collection.
' (Some prefer this class nested in the collection class.)
Public Class BoxEnumerator
Implements IEnumerator(Of Box)
Private _collection As BoxCollection
Private curIndex As Integer
Private curBox As Box
Public Sub New(ByVal collection As BoxCollection)
MyBase.New()
_collection = collection
curIndex = -1
curBox = Nothing
End Sub
Private Property Box As Box
Public Function MoveNext() As Boolean _
Implements IEnumerator(Of Box).MoveNext
curIndex = curIndex + 1
If curIndex = _collection.Count Then
' Avoids going beyond the end of the collection.
Return False
Else
'Set current box to next item in collection.
curBox = _collection(curIndex)
End If
Return True
End Function
Public Sub Reset() _
Implements IEnumerator(Of Box).Reset
curIndex = -1
End Sub
Public Sub Dispose() _
Implements IEnumerator(Of Box).Dispose
End Sub
Public ReadOnly Property Current() As Box _
Implements IEnumerator(Of Box).Current
Get
If curBox Is Nothing Then
Throw New InvalidOperationException()
End If
Return curBox
End Get
End Property
Private ReadOnly Property Current1() As Object _
Implements IEnumerator.Current
Get
Return Me.Current
End Get
End Property
End Class
' Defines two boxes as equal if they have the same dimensions.
Public Class BoxSameDimensions
Inherits EqualityComparer(Of Box)
Public Overrides Function Equals(ByVal b1 As Box, ByVal b2 As Box) As Boolean
If b1.Height = b2.Height And b1.Length = b2.Length And b1.Width = b2.Width Then
Return True
Else
Return False
End If
End Function
Public Overrides Function GetHashCode(ByVal bx As Box) As Integer
Dim hCode As Integer = bx.Height ^ bx.Length ^ bx.Width
Return hCode.GetHashCode()
End Function
End Class
Commenti
IEnumerator<T> è l'interfaccia di base per tutti gli enumeratori generici.
L'istruzione foreach del linguaggio C# (For Each in Visual Basic) nasconde la complessità degli enumeratori. Pertanto, è consigliabile usare foreach anziché modificare direttamente l'enumeratore.
Gli enumeratori possono essere usati per leggere i dati nella raccolta, ma non possono essere usati per modificare la raccolta sottostante.
Inizialmente, l'enumeratore viene posizionato prima del primo elemento della raccolta. In questa posizione, Current non è definito. Pertanto, è necessario chiamare per far avanzare MoveNext l'enumeratore al primo elemento della raccolta prima di leggere il valore di Current.
Current restituisce lo stesso oggetto finché non MoveNext viene chiamato . MoveNext imposta Current sull'elemento successivo.
Se MoveNext passa la fine della raccolta, l'enumeratore viene posizionato dopo l'ultimo elemento della raccolta e MoveNext restituisce false. Quando l'enumeratore si trova in questa posizione, le chiamate successive per MoveNext restituire falseanche . Se l'ultima chiamata a MoveNext restituisce false, Current non è definita. Non è possibile impostare Current nuovamente sul primo elemento della raccolta. È invece necessario creare una nuova istanza dell'enumeratore.
Il Reset metodo viene fornito per l'interoperabilità COM. Non deve necessariamente essere implementata; In alternativa, l'implementatore può semplicemente generare un oggetto NotSupportedException. Tuttavia, se si sceglie di eseguire questa operazione, assicurarsi che nessun chiamante si basi sulla Reset funzionalità.
Se vengono apportate modifiche alla raccolta, ad esempio l'aggiunta, la modifica o l'eliminazione di elementi, il comportamento dell'enumeratore non è definito.
L'enumeratore non ha accesso esclusivo alla raccolta; pertanto, l'enumerazione tramite una raccolta non è intrinsecamente una procedura thread-safe. Per garantire la thread safety durante l'enumerazione, è possibile bloccare la raccolta durante l'intera enumerazione. Per consentire l'accesso alla raccolta da parte di più thread per la lettura e la scrittura, è necessario implementare la propria sincronizzazione.
Le implementazioni predefinite delle raccolte nello System.Collections.Generic spazio dei nomi non vengono sincronizzate.
Note per gli implementatori
L'implementazione di questa interfaccia richiede l'implementazione dell'interfaccia non generica IEnumerator . I MoveNext() metodi e Reset() non dipendono da Te vengono visualizzati solo sull'interfaccia non generica. La Current proprietà viene visualizzata in entrambe le interfacce e presenta tipi restituiti diversi. Implementare la proprietà non generica Current come implementazione esplicita dell'interfaccia. Ciò consente a qualsiasi consumer dell'interfaccia non generica di utilizzare l'interfaccia generica.
Implementa IDisposableinoltre IEnumerator<T> , che richiede l'implementazione del Dispose() metodo . In questo modo è possibile chiudere le connessioni al database o rilasciare handle di file o operazioni simili quando si usano altre risorse. Se non sono presenti risorse aggiuntive da eliminare, fornire un'implementazione vuota Dispose() .
Proprietà
| Nome | Descrizione |
|---|---|
| Current |
Ottiene l'elemento nella raccolta in corrispondenza della posizione corrente dell'enumeratore. |
Metodi
| Nome | Descrizione |
|---|---|
| Dispose() |
Esegue attività definite dall'applicazione associate alla liberazione, al rilascio o alla reimpostazione di risorse non gestite. (Ereditato da IDisposable) |
| MoveNext() |
Sposta l'enumeratore all'elemento successivo della raccolta. (Ereditato da IEnumerator) |
| Reset() |
Imposta l'enumeratore sulla posizione iniziale, ovvero prima del primo elemento della raccolta. (Ereditato da IEnumerator) |