遅延:.NET 4.0でのオブジェクトのオンデマンド設計

.NETフレームワークで新しい機能を見つけたときに気に入っています。 これらはすべて、会議や雑誌ですべての愛と認識を得る大きな関心事です。



Lazy <T>はその1つにすぎません。



いくつかのシナリオでアプリケーションを作成しているが、残りのシナリオではなく、特定のオブジェクトが必要だと想像してみましょう。 さらに、このオブジェクトの作成と使用が非常に高価であると仮定します。 アプリケーションを起動するたびに作成する必要はありません。 このオブジェクトは、必要なときにのみ作成する必要があります。



もちろん、自分でそれを理解することもできますが、Lazy <T>を使用すると簡単になります。 高価なオブジェクトにレイジーラッパーを作成するだけです。



Lazy< ExpensiveResource > ownedResource = new Lazy< ExpensiveResource >();







「ownedResource.Value」を参照するだけで、この高価な機能を利用できます。 ownedResource.Valueに初めてアクセスすると、高価なリソースが割り当てられますが、それより早くはありません。



Lazy <T>には、IsValueCreatedというブール型プロパティもあります。これは、Valueプロパティでオブジェクトが作成されているかどうかを確認できます。 これは、高価なリソースの情報を保存する必要がある場合に便利ですが、使用する場合に限ります。



デフォルトのコンストラクタなしの型サポート



Lazy <T>は、new()の存在に制約を課しません。 Lazy <T>は、他のコンストラクターやファクトリーメソッドを使用して作成する必要がある型に使用できます。 2番目のコンストラクターは、新しい高価なリソースを返すFunc <T>デリゲートを定義します。



Lazy< ExpensiveResource > ownedResource = new Lazy< ExpensiveResource >(

() => new ExpensiveResource( "filename.data" ));








このコンストラクターを使用して、コードが高価なリソースを作成する方法をより適切に制御できます。 ここでは別のコンストラクタを使用しましたが、ファクトリメソッド、IoCコンテナ、または別のメソッドを使用できます。



私たちはマルチコアの世界に住んでいます



Lazy <T>にはさらに2つのコンストラクターがあります。



public Lazy( bool isThreadSafe);

public Lazy( Func <T> valueFactory, bool isThreadSafe);








これらの2つのコンストラクターは、マルチスレッド環境で実行されており、遅延オブジェクトの作成を同期する必要があることを示しています(とりわけ、これは高価なリソースです。いくつか必要はありません)。



これは単純なタイプですが、何度も何度も自分にとって便利なタイプの1つです。



追加されてうれしいです。



タグ:C#、. NET General、C#General、DevCenterPosts



All Articles