2011-06-21 31 views
19

遅延初期化とは何ですか?ここで私は検索のGoogleの後に得たコードです。.NET 4で遅延初期化

class MessageClass 
{ 
    public string Message { get; set; } 

    public MessageClass(string message) 
    { 
     this.Message = message; 
     Console.WriteLine(" *** MessageClass constructed [{0}]", message); 
    } 
} 

Lazy<MessageClass> someInstance = new Lazy<MessageClass>(
    () => new MessageClass("The message") 
    ); 

私はこのようにオブジェクトを作成する必要があります....実際には、このようにオブジェクトを作成する必要があるとき......答えを探しています。こっちMSDNドキュメント

答えて

48

.NET 4.0のLazy機能の目的は、多くの開発者は、プロパティを持つ以前に使用したパターンを交換することです。 「古い」方法は

private MyClass _myProperty; 

public MyClass MyProperty 
{ 
    get 
    { 
     if (_myProperty == null) 
     { 
      _myProperty = new MyClass(); 
     } 
     return _myProperty; 
    } 
} 

のようなもの。この方法だろう、_myProperty一度だけインスタンス化され、唯一それが必要とされる時に取得します。それが決して必要でないなら、インスタンス化されることはありません。 Lazyと同じことを行うには、あなたはもちろん

private Lazy<MyClass> _myProperty = new Lazy<MyClass>(() => new MyClass()); 

public MyClass MyProperty 
{ 
    get 
    { 
     return _myProperty.Value; 
    } 
} 

を書くかもしれない、あなたはLazyで物事をこのようにやってに制限はなく、目的は実際にそれまでそうせずに値をインスタンス化する方法を指定することですされていません必要です。呼び出しコードは、値がインスタンス化されているかどうかを追跡する必要はありません。むしろ、呼び出しコードは単にValueプロパティを使用します。 (IsValueCreatedプロパティで値がインスタンス化されているかどうかを調べることができます)

+0

MyPropertyプロパティが呼び出されると、...次の行がプライベートLazyを実行する場合 _myProperty = new Lazy 新しいMyClass()); どのようにプロパティが呼び出されます.....私はちょうど明示的にプロパティを呼び出す必要があるため、私は理解していません。 – Mou

+0

@ user728750私はあなたが何を求めているのかよくわからない。 '_myProperty'は単なるプライベートインスタンス変数です。また、それを含むクラスのコンストラクタで初期化することもできます(実際にはより良い方法です)。プロパティーの使用は多少選択的ですが、そうでなければ必要とされる '.Value'呼び出しを抽象化します。 – Andrew

+0

この同じことは、ちょうど 'lazy val MyProperty = new MyClass()'でScalaで行うことができます。あまりにも悪いことに、.NET用のScalaコンパイラをリリースすることは決してありませんでした。 – sparebytes

6

チェックアウト:オブジェクトのLazy Initialization

遅延初期化は、それが最初に使用されるまで、その作成が延期されることを意味します。レイジー初期化は、主にパフォーマンスを向上させ、無駄な計算を回避し、プログラムのメモリ要件を削減するために使用されます。

8

「遅延初期化がLazy.Valueプロパティがアクセスされ又はLazy.ToStringメソッドが呼び出される最初に発生する。

大またはリソース集約オブジェクトの作成または延期するレイジーのインスタンスを使用し特にそのような作成や実行がプログラムの存続期間中に起こらない場合には、リソース集約型のタスクを実行する必要があります。

http://msdn.microsoft.com/en-us/library/dd642331.aspx

関連する問題