C #: Onde para implementar um personalizado IEnumerator
-
19-09-2019 - |
Pergunta
dizer que tenho uma classe que implementa IEnumerable<T>
. Ele atualmente usa o yield
palavra-chave no método GetEnumerator()
. Mas agora eu preciso fazer um pouco mais, por exemplo, eu gostaria de limpar depois de mim mesmo. Para fazer isso, a menos que eu tenha esquecido alguma coisa, eu preciso para implementar a interface IEnumerator<T>
. Mas onde você diria que eu deveria fazer isso?
Caso a própria classe implementá-lo e regresso GetEnumerator()
this
? Ou seria melhor para escondê-lo em uma classe particular? Ou deveria talvez ser apenas uma classe totalmente diferente? Quais são algumas práticas comuns para isso?
Solução
Se tudo que você precisa fazer é limpar alguns recursos quando o recenseador é descartado, como no final de um ciclo foreach
, então você pode fazer isso com o que você tem, basta adicionar um try / finally bloco para o seu iterador método.
Como esta:
public IEnumerator<T> GetEnumerator()
{
try
{
// your iterator code here
}
finally
{
// cleanup code here
}
}
Isso é tudo que existe para ela.
Outras dicas
Eu iria com uma classe para o IEnumerator
Você pode não precisar de classe escrita para tudo isso. Um método iterator pode retornar IEnumerable<T>
, se a sua classe só precisa implementar IEnumerable<T>
e nada mais, basta escrever um método iterador para a coisa toda.
Se não, e você tem que ficar com uma classe externa que implementos IEnumerable<T>
por ter um método iterator fazer GetEnumerator
, então você não tem que fazer qualquer coisa muito difícil de limpar depois de iteração.
deriva IEnumerator<T>
de IDisposable
. Um método iterator implementos Dispose
executando blocos finally
ou qualquer código após a última yield return
.