🗂

C#のイテレータパターン

2022/10/18に公開

Qiitaより転載
2017/3/23 初投稿


JavaからC#に移行した人は気づいている気がするけど、C#ではイテレータではなく「Enumerator」という名前を使用してる。
名書「Java言語で学ぶデザインパターン(以下デザパタ本)」のイテレータパターンと比べながら、C#のイテレータを見てみる。

デザパタ本でのイテレータパターンのインターフェースは以下のように実装されている。

    interface IAggregate
    {
        IIterator Iterator { get; }
    }

    interface IIterator
    {
        bool HasNext();
        object Next { get; }
    }

これに対して、Enumeratorは以下のようになる

    interface IEnumerable
    {
        IEnumerator GetEnumerator();
    }

    interface IEnumerator
    {
        bool MoveNext();
        void Reset();
        object Current { get; }
    }

ここの大きな違いは、Javaで採用されているイテレータは「次に動けるか確認して、できれば動く」なのに対して、C#では「次に動いた結果、成功したか返す」という実装になっている点だ。

C#では、「どうせHasNextでTrueだったら動くんだから、あらかじめ動いてやるよ」ということなのだろう。どっちのほうがいい、ということはない。好みの違いだろう。ただし、この差を気にしておかないと、MoveNextから途中離脱した時にステートの違いに気づかないかもしれない。

Discussion