IEnumerator<T> Interface
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Dá suporte a uma iteração simples em vez de uma coleção genérica.
generic <typename T>
public interface class IEnumerator : IDisposable, System::Collections::IEnumerator
public interface IEnumerator<out T> : IDisposable, System.Collections.IEnumerator
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
Parâmetros de tipo
- T
O tipo de objetos a serem enumerados.
Este parâmetro de tipo é covariante. Isso significa que é possível usar o tipo especificado ou qualquer tipo mais derivado. Para obter mais informações sobre covariância e contravariância, consulte Covariância e contravariância em genéricos.- Derivado
- Implementações
Exemplos
O exemplo a seguir mostra uma implementação da IEnumerator<T> interface para uma classe de coleção de objetos personalizados. O objeto personalizado é uma instância do tipo Box
e a classe de coleção é BoxCollection
. Este exemplo de código faz parte de um exemplo maior fornecido para a ICollection<T> interface .
// 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
Comentários
IEnumerator<T> é a interface base para todos os enumeradores genéricos.
A instrução foreach
da linguagem C# (for each
no C++, For Each
no Visual Basic) oculta a complexidade dos enumeradores. Portanto, o uso de foreach
é recomendado, em vez de manipular diretamente o enumerador.
Os enumeradores podem ser usados para ler os dados na coleção, mas não podem ser usados para modificar a coleção subjacente.
Inicialmente, o enumerador é posicionado antes do primeiro elemento da coleção. Nesta posição, Current está indefinido. Por isso, você deve chamar MoveNext para avançar o enumerador até o primeiro elemento da coleção antes de ler o valor de Current.
Current retorna o mesmo objeto até MoveNext que seja chamado. MoveNext define Current como o próximo elemento.
Caso MoveNext passe o final da coleção, o enumerador é posicionado após o último elemento na coleção e MoveNext retorna false
. Quando o enumerador está nessa posição, as chamadas subsequentes para MoveNext também retornam false
. Caso a última chamada para MoveNext tenha retornado false
, Current está indefinido. Não é possível definir Current como o primeiro elemento da coleção novamente; você deve criar uma nova instância de enumerador em vez disso.
O Reset método é fornecido para interoperabilidade COM. Ela não precisa necessariamente ser implementada; Em vez disso, o implementador pode simplesmente lançar um NotSupportedException. No entanto, se você optar por fazer isso, verifique se nenhum chamador está confiando na Reset funcionalidade.
Se forem feitas alterações na coleção, como adicionar, modificar ou excluir elementos, o comportamento do enumerador será indefinido.
O enumerador não tem acesso exclusivo à coleção; por isso, a enumeração por meio de uma coleção não é um procedimento thread-safe intrínseco. Para garantir acesso thread-safe durante a enumeração, é possível bloquear a coleção durante toda a enumeração. Para permitir que a coleção seja acessada por vários threads para leitura e gravação, você deve implementar sua própria sincronização.
As implementações padrão de coleções no namespace System.Collections.Generic não são sincronizadas.
Notas aos Implementadores
A implementação dessa interface requer a implementação da interface não genérica IEnumerator . Os MoveNext() métodos e Reset() não dependem T
de e aparecem apenas na interface não genérica. A Current propriedade aparece em ambas as interfaces e tem tipos de retorno diferentes. Implemente a propriedade não genérica Current como uma implementação de interface explícita. Isso permite que qualquer consumidor da interface não genérica consuma a interface genérica.
Além disso, IEnumerator<T> implementa IDisposable, que exige que você implemente o Dispose() método . Isso permite que você feche conexões de banco de dados ou liberar identificadores de arquivo ou operações semelhantes ao usar outros recursos. Se não houver recursos adicionais para descartar, forneça uma implementação vazia Dispose() .
Propriedades
Current |
Obtém o elemento na coleção na posição atual do enumerador. |
Métodos
Dispose() |
Realiza tarefas definidas pelo aplicativo associadas à liberação ou à redefinição de recursos não gerenciados. (Herdado de IDisposable) |
MoveNext() |
Avança o enumerador para o próximo elemento da coleção. (Herdado de IEnumerator) |
Reset() |
Define o enumerador com sua posição inicial, que é antes do primeiro elemento da coleção. (Herdado de IEnumerator) |
Aplica-se a
Confira também
Comentários
Enviar e exibir comentários de