Il presente articolo è stato tradotto manualmente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. |
Traduzione
Originale
|
Interfaccia IEnumerator<T>
Supporta una iterazione semplice in un insieme generico.
Assembly: mscorlib (in mscorlib.dll)
Parametri di tipo
- out T
Tipo degli oggetti da enumerare.
Il parametro di questo tipo è covariante. Ciò significa che è possibile utilizzare il tipo specificato o qualsiasi tipo più derivato. Per ulteriori informazioni sulla covarianza e la controvarianza, vedere Covarianza e controvarianza nei generics.
Il tipo IEnumerator<T> espone i seguenti membri.
| Nome | Descrizione | |
|---|---|---|
|
Current | Ottiene l'elemento corrente dell'insieme. (Ereditato da IEnumerator) |
|
Current | Ottiene l'elemento dell'insieme in corrispondenza della posizione corrente dell'enumeratore. |
| Nome | Descrizione | |
|---|---|---|
|
Dispose | Esegue attività definite dall'applicazione, ad esempio libera, rilascia o reimposta risorse non gestite. (Ereditato da IDisposable) |
|
MoveNext | Consente di spostare l'enumeratore all'elemento successivo dell'insieme. (Ereditato da IEnumerator) |
|
Reset | Imposta l'enumeratore sulla propria posizione iniziale, ovvero prima del primo elemento nell'insieme. (Ereditato da IEnumerator) |
IEnumerator<T> rappresenta l'interfaccia di base per tutti gli enumeratori generici.
L'istruzione foreach del linguaggio C# (for each in C++, For Each in Visual Basic) consente di nascondere la complessità degli enumeratori. Pertanto, si consiglia l'utilizzo di foreach, anziché la modifica diretta dell'enumeratore.
Gli enumeratori possono essere utilizzati per leggere i dati dell'insieme, ma non per modificare l'insieme sottostante.
Inizialmente, l'enumeratore è posizionato prima del primo elemento nell'insieme. In questa posizione, la proprietà Current è indefinita. Pertanto, è necessario chiamare il metodo MoveNext per spostare in avanti l'enumeratore, in corrispondenza del primo elemento dell'insieme, prima di leggere il valore di Current.
Current restituisce lo stesso oggetto fino alla chiamata di MoveNext. MoveNext imposta Current sull'elemento successivo.
Se il metodo MoveNext supera la fine dell'insieme, l'enumeratore viene posizionato dopo l'ultimo elemento dell'insieme e il metodo MoveNext restituisce false. Quando l'enumeratore si trova in questa posizione, anche le successive chiamate a MoveNext restituiscono false. Se l'ultima chiamata al metodo MoveNext ha restituito false, la proprietà Current non è definita. Non è possibile impostare nuovamente la proprietà Current sul primo elemento dell'insieme; è necessario creare una nuova istanza di enumeratore.
Il metodo Reset viene fornito per l'interoperabilità COM. Non deve essere necessariamente implementato. È sufficiente che l'implementatore generi un'eccezione NotSupportedException.
Un enumeratore rimane valido fino a quando l'insieme rimane invariato. Se vengono apportate modifiche all'insieme, ad esempio l'aggiunta, la modifica o l'eliminazione di elementi, l'enumeratore verrà irrimediabilmente invalidato e il relativo comportamento sarà non definito.
L'enumeratore non dispone di accesso esclusivo all'insieme, pertanto il processo di enumerazione di un insieme non è di per sé thread-safe. Per garantire che l'enumerazione sia thread-safe, è possibile bloccare l'insieme durante l'intera enumerazione. Per consentire l'accesso all'insieme in lettura e scrittura da parte di più thread, è necessario implementare la propria sincronizzazione.
Le implementazioni predefinite di insiemi nello spazio dei nomi System.Collections.Generic non sono sincronizzate.
Note per gli implementatori
Per poter implementare questa interfaccia è necessario implementare l'interfaccia non generica IEnumerator. I metodi MoveNext e Reset non dipendono da T e vengono visualizzati soltanto su interfacce non generiche. La proprietà Current compare in entrambe le interfacce e può restituire tipi diversi. Implementare la proprietà non generica IEnumerator.Current come implementazione dell'interfaccia esplicita. Questo consente a qualsiasi consumer dell'interfaccia non generica di utilizzare l'interfaccia generica.
Nell'esempio di codice riportato di seguito viene illustrata l'implementazione dell'interfaccia IEnumerator<T> per una classe di insiemi di oggetti personalizzati. L'oggetto personalizzato è un'istanza del tipo Box e la classe di insieme è BoxCollection. Questo esempio di codice fa parte di un esempio più esaustivo 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; } } }
Windows 7, Windows Vista SP1 o versione successiva, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (componenti di base del server non supportati), Windows Server 2008 R2 (componenti di base del server supportati con SP1 o versione successiva), Windows Server 2003 SP2
.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.