🗂
C#のイテレータパターン
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