C#の:カスタムを実装するためのIEnumerator
-
19-09-2019 - |
質問
私は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メソッドは、最後のDispose
後finally
ブロックまたは任意のコードを実行することによりyield return
を実装します。