なぜForEachメソッドの方が速いのかは、内部構造を考えれば容易に分かるだろう。ForEachメソッドは、繰り返し1回ごとにメソッドを1回だけ呼ぶ。しかし、反復子はMoveNextメソッドを呼んでからCurrentプロパティで値を取得する必要があり、2回の呼び出しが発生する。さらに、周辺にかなり込み入ったコードが生成されていることから考えて、大きな性能差が出るのはやむを得ないところだろう。

 筆者はすでにかなりの量のコードをC# 2.0で書いているが、実はその間に一度もyield return文を使ったことがなかった。なぜかといえば、ForEachメソッドのテクニックを使えば、使う必要もなければ使うメリットもないからだ。しかし、配列などを列挙する場合にはforeach文を多用していた。これもあまりメリットがない。これからはForEachメソッドを積極的に使おう……と心に決めた次第である。