web-dev-qa-db-ja.com

.NET4での遅延初期化

レイジー初期化とは何ですか。これが私がグーグルで検索した後に得たコードです。

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")
    );

なぜこの方法でオブジェクトを作成する必要があるのですか...実際にこの方法でオブジェクトを作成する必要があるのに......答えを探しています。

26
Mou

.NET4.0のLazy機能の目的は、多くの開発者が以前に使用していたパターンをプロパティに置き換えることです。 「古い」方法は次のようになります

private MyClass _myProperty;

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

こちらです、 _myPropertyインスタンス化されるのは、必要な場合に1回だけです。必要にならない場合は、インスタンス化されません。 Lazyで同じことを行うには、次のように記述します。

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

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

もちろん、Lazyを使用してこの方法で行うことに制限されていませんが、目的は、必要になるまで実際にインスタンス化せずに値をインスタンス化する方法を指定することです。呼び出し元のコードは、値がインスタンス化されているかどうかを追跡する必要はありません。むしろ、呼び出し元のコードはValueプロパティを使用するだけです。 (値がIsValueCreatedプロパティでインスタンス化されているかどうかを確認することは可能です。)

61
Andrew

「レイジー初期化は、Lazy.Valueプロパティに最初にアクセスしたとき、またはLazy.ToStringメソッドが呼び出されたときに発生します。

Lazyのインスタンスを使用して、大きなオブジェクトやリソースを大量に消費するオブジェクトの作成や、リソースを大量に消費するタスクの実行を延期します。特に、プログラムの存続期間中にそのような作成や実行が行われない場合はそうです。」

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

9
asawyer

ここでmsdnのドキュメントをチェックしてください: レイジー初期化

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

8
Pranay Rana