いいえ、匿名関数は使用しません。基本的に、コンパイラはコードを、ここで示した while ループとほぼ同等のものに変換します。
foreach
は関数呼び出しではありませんfor
。ループやループと同じように、言語自体に組み込まれていwhile
ます。何かを返したり、何らかの関数を「取る」必要はありません。
foreach
興味深いしわがいくつかあることに注意してください。
- 配列を反復処理する場合 (コンパイル時に認識される)、コンパイラはループ カウンターを使用して、配列の長さと比較することができます。
IEnumerator
foreach
最後にイテレータを破棄します。IEnumerator<T>
which extendsの場合は簡単ですIDisposable
が、そうでIEnumerator
ない場合と同様に、コンパイラはチェックを挿入して、イテレータが実装しているかどうかを実行時にテストします。IDisposable
- 適切なandメンバーを持つ型を返す適切なメソッドがある限り、
IEnumerable
orを実装しない型を反復処理できます。コメントに記載されているように、型はorを明示的に実装することもできますが、 /以外の型を返すpublic メソッドを持つことができます。例については、を参照してください。これにより、多くの場合、参照型オブジェクトが不必要に作成されるのを回避できます。IEnumerable<T>
GetEnumerator()
Current
MoveNext()
IEnumerable
IEnumerable<T>
GetEnumerator()
IEnumerator
IEnumerator<T>
List<T>.GetEnumerator()
詳細については、C# 4 仕様のセクション 8.8.4 を参照してください。