c# - 引数 - unity lazy



.NET 4での遅延初期設定 (2)

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

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

なぜ私はこのようにオブジェクトを作成すべきですか...実際には、このようにオブジェクトを作成する必要があるとき......答えを探しています。


Answer #1

.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プロパティで値がインスタンス化されているかどうかを調べることができます。


Answer #2

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

Lazyのインスタンスを使用して、大規模またはリソース集約型オブジェクトの作成や、リソース集約型タスクの実行を延期します。特に、その作成または実行がプログラムの存続期間中に発生しない場合があります。

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





.net-4.0