遅延実行とレイジー評価 (LINQ to XML)

クエリと軸の操作は、多くの場合、遅延実行を使用するように実装されています。 この記事では、遅延実行の要件と利点、および実装に関する注意点について説明します。

遅延実行

遅延実行とは、"具体" 値が実際に必要となるまで、式の評価を遅らせることを意味します。 大きなデータ コレクションの操作が必要な場合、特に連結されたクエリや操作が含まれているプログラムでは、遅延実行によってパフォーマンスが大幅に向上することがあります。 最も効果的なケースでは、遅延実行を使用することによって、ソース コレクションの繰り返し処理を 1 度行うだけで済むようになります。

LINQ テクノロジでは、コア System.Linq クラスのメンバーにおいても、System.Xml.Linq.Extensions などのさまざまな LINQ 名前空間の拡張メソッドにおいても、遅延実行が広く利用されています。

C# 言語では、反復子ブロック内で yield (C# リファレンス) キーワード (yield-return ステートメントの形式) を使用することにより、遅延実行が直接サポートされます。 このような反復子は IEnumerator 型または IEnumerator<T> 型 (または派生型) のコレクションを返します。

集中評価とレイジー評価

遅延実行を実装するメソッドを記述するときは、レイジー評価と集中評価のどちらを使用してメソッドを実装するかについても決定する必要があります。

  • "レイジー評価" では、反復子を呼び出すたびに、ソース コレクションの 1 つの要素が処理されます。 これが、一般的な反復子の実装方法です。
  • "集中評価" では、反復子への最初の呼び出しの結果として、コレクション全体が処理されます。 ソース コレクションの一時的なコピーが必要になる場合もあります。 たとえば OrderBy メソッドでは、最初の要素を返す前に、コレクション全体を並べ替える必要があります。

通常は、レイジー評価を使用するとパフォーマンスが向上します。コレクション評価時のオーバーヘッド処理が均等に分散され、一時データの使用が最小限に抑えられるためです。 もちろん、操作によっては、中間結果を具体化するより他に方法がない場合もあります。

C# と Visual Basic で遅延実行をプログラミングする例については、「遅延実行の例」を参照してください。

関連項目