質問

私はIEnumerable<T>を実装するクラスを持っていると言います。これは、現在yield方法でGetEnumerator()キーワードを使用しています。しかし、今、私は自分の後にクリーンアップしたいと思います例えば、もう少しを行う必要があります。私は何かを見落としていない限り、これを行うために、私はIEnumerator<T>インタフェースを実装する必要があります。しかし、ここで私はそれを行う必要があると思いますか?

クラス自体は、それとGetEnumerator()リターンthisを実装する必要がありますか?それとも、プライベートクラスでそれを非表示にする方が良いでしょうか?それとも、多分ちょうど全く異なるクラスすべきですか?いくつかの一般的な慣行は、これには何ですか?

役に立ちましたか?

解決

あなたがする必要があるすべては、列挙子がforeachループの終わりのように、処分されたとき、ちょうどあなたのイテレータにブロックし、最後に/トライを追加し、その後、あなたはあなたが持っているものであることを行うことができ、いくつかのリソースをクリーンアップである場合方法ます。

このよう

public IEnumerator<T> GetEnumerator()
{
    try
    {
        // your iterator code here
    }
    finally
    {
        // cleanup code here
    }
}

これでお終いです。

他のヒント

私はIEnumeratorをのクラスで行くだろう。これは、コレクションの一部ではなく、列挙のプロセスの一部ではない状態(現在位置)を格納する必要があります。

あなたは、このすべてのクラスを記述する必要がないかもしれません。あなたのクラスは唯一IEnumerable<T>と他には何を実装する必要がある場合は、ちょうど全体のことのためのiteratorメソッドを記述するように、iteratorメソッドは、IEnumerable<T>を返すことができます。

もしない、とあなたは、あなたが繰り返しの後にクリーンアップすることは非常に困難な何もする必要はありません、IEnumerable<T>を行うためのiteratorメソッドを持つことでGetEnumeratorを実装外部クラスに固執する必要があります。

IEnumerator<T>IDisposableに由来します。 iteratorメソッドは、最後のDisposefinallyブロックまたは任意のコードを実行することによりyield returnを実装します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top