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 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 interface IEnumerator<T> 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 interface 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
Comentários
IEnumerator<T> é a interface base para todos os enumeradores genéricos.
A instrução foreach
da linguagem C# (for each
em C++, For Each
no Visual Basic) oculta a complexidade dos enumeradores. Portanto, é recomendável usar foreach
, 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 é indefinido. Portanto, você deve chamar MoveNext para avançar o enumerador para o primeiro elemento da coleção antes de ler o valor de Current.
Current retorna o mesmo objeto até que MoveNext seja chamado. MoveNext define Current para o próximo elemento.
Se MoveNext passar o final da coleção, o enumerador será posicionado após o último elemento na coleção e MoveNext retornará false
. Quando o enumerador estiver nessa posição, as chamadas subsequentes para MoveNext também retornarão false
. Se a última chamada para MoveNext retornada false
, Current será indefinida. Não é possível definir Current para o primeiro elemento da coleção novamente; em vez disso, você deve criar uma nova instância de enumerador.
O método Reset é fornecido para interoperabilidade COM. Ele não precisa necessariamente ser implementado; 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 funcionalidade Reset.
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; portanto, enumerar por meio de uma coleção não é intrinsecamente um procedimento thread-safe. Para garantir a segurança do thread durante a enumeração, você pode 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
Implementar essa interface requer a implementação da interface de IEnumerator não genérica. Os métodos MoveNext() e Reset() não dependem de T
e aparecem apenas na interface não genérica. A propriedade Current aparece em ambas as interfaces e tem tipos de retorno diferentes. Implemente a propriedade Current não genérica 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, o que exige que você implemente o método Dispose(). Isso permite que você feche conexões de banco de dados ou identificadores de arquivo de versão ou operações semelhantes ao usar outros recursos. Se não houver recursos adicionais para descartar, forneça uma implementação de Dispose() vazia.
Propriedades
Current |
Obtém o elemento na coleção na posição atual do enumerador. |
Métodos
Dispose() |
Executa tarefas definidas pelo aplicativo associadas à liberação, 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 como sua posição inicial, que é antes do primeiro elemento na coleção. (Herdado de IEnumerator) |