2

を実装するクラスがあるとしますIEnumerable<T>。現在、メソッドでyieldキーワードを使用しています。GetEnumerator()しかし、今はもう少しやる必要があります。たとえば、自分の後で片付けたいと思います。これを行うには、何かを見落としていない限り、IEnumerator<T>インターフェイスを実装する必要があります。しかし、どこでそれをすべきだと思いますか?

クラス自体がそれを実装してGetEnumerator()返す必要がありthisますか?それとも、プライベートクラスに隠したほうがいいでしょうか?それとも、まったく別のクラスにする必要がありますか?これに対するいくつかの一般的な慣行は何ですか?

4

3 に答える 3

6

ループの終わりのように、列挙子が破棄されたときにいくつかのリソースをクリーンアップするforeachだけでよい場合は、持っているものでそれを行うことができます。イテレーターメソッドにtry/finallyブロックを追加するだけです。

このような:

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

これですべてです。

于 2009-10-03T13:28:09.663 に答える
2

IEnumerator<T>のクラスを使用します。これには、コレクションの一部ではなく、列挙プロセスの一部である状態(現在の位置)を格納する必要があります。

于 2009-10-03T13:27:56.063 に答える
0

このためのクラスを作成する必要はまったくないかもしれません。イテレータメソッドはを返すことができるIEnumerable<T>ので、クラスが実装するだけでIEnumerable<T>他に何も必要ない場合は、すべてのイテレータメソッドを作成するだけです。

IEnumerable<T>そうでない場合は、イテレータメソッドを使用して実装する外部クラスを使用するGetEnumerator必要があります。反復後にクリーンアップするのが非常に難しいことは何もする必要はありません。

IEnumerator<T>から派生しIDisposableます。イテレータメソッドは、最後の。の後にブロックまたは任意のコードをDispose実行することによって実装されます。finallyyield return

于 2009-10-03T13:33:32.370 に答える