yield return を使用した遅延実行について学びました。ここで、.Net 4 ( ) で導入された型を見てきましたLazy<T>
。私の質問は次のとおりです。これらの間に関係はありますか?ILSpy でのメソッドを確認しましたがLazy<T>
、yield が返されるメソッドの実装は見たことがありません。では、それらはより低いレベルで接続されていますか?
5 に答える
彼らはお互いに何の関係もありません。
イテレータ メソッド ( yield return
LINQ メソッドなどの を使用するメソッド) は、遅延実行を使用していました。
つまり、結果を列挙するまで、メソッド内のコードは実行されません。
Lazy<T>
Value
プロパティが最初にアクセスされたときにのみ値を計算するラッパーです。
いいえ、お互いに何の関係もありません。
yield
反復中にオブジェクトへの現在のポインタを返すために使用されます。大規模なデータセットの反復処理とフィルタリング/検証に非常に役立ちます...一部のデータは現代的 (反復中) であるため、メモリが不当に大きくなるため、フィルタリングされた (たとえば) 値を最初にキャッシュする必要はありません。
Lazy は、代わりに、遅延/遅延または遅延初期化に関するものです。このように指定した型のインスタンスの遅い初期化がすべてです。
例: 初期化時に大量のメモリを割り当てるタイプがありますが、アプリケーション ワークフローでは、ユーザーがそのタイプ (特定のユーザーが要求した操作) を必要としないことがよくあるので、 を使用Lazy<T>
してタイプを定義します。ただしdo not initialize
、実際に必要な場合にのみメモリを割り当ててください。
これらの概念の間には何の関係もないことがわかります。
いいえ - イテレータは とは異なる機能を提供することを意図していますLazy<T>
。
イテレータは、IEnumerable<T>
遅延実行を使用して実装する方法を提供し、「怠惰」の形を提供しますが、意図されたユースケースは とはまったく異なりLazy<T>
ます。 Lazy<T>
遅延コンストラクターに同じインスタンスの複数のフェッチを提供します。一方、反復子は、単一の値ではなく、一連の値を評価して返すことを目的としています。
イテレータ ( yield return
) で実装されたメソッドを呼び出すと、毎回シーケンスが再評価されます。
さらに、Lazy<T>
(オプションで) スレッドの安全性を保証できます。
あまり。 またはyield return
の戻り値の型を持つメソッドを実装するために使用されます。そのような戻り値の型を持つメソッドがないため、明らかに反復子ブロックはその実装で使用されていません。IEnumerable<T>
IEnumerator<T>
Lazy<T>
いいえ、この 2 つは相互に使用したり依存したりしません。
を使用しyield return
ませんLazy<T>
。
ポイントは、実際に必要になるまで (または必要になったとしても) 、Lazy<T>
コストのかかるデータの生成を延期することです。
「このデータが本当に必要な場合は、私が行って作成できますが、必要ない場合は、時間を節約できました」と言って返すことができます。