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?

Foi útil?

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 . Isto terá de Estado loja (posição atual), que não é parte da coleção, mas sim parte do processo de enumerar.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top