Ленивая инициализация в .NET 4 - PullRequest
26 голосов
/ 21 июня 2011

Что такое ленивая инициализация. Вот код, который я получил после поиска 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")
    );

почему я должен создавать объект таким образом .... когда на самом деле нам нужно создавать объект таким образом ...... ищет ответ.

Ответы [ 3 ]

61 голосов
/ 21 июня 2011

Цель функции Lazy в .NET 4.0 - заменить шаблон, который многие разработчики использовали ранее, на свойства. «Старый» путь был бы что-то вроде

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.)

9 голосов
/ 21 июня 2011

"Ленивая инициализация происходит при первом обращении к свойству Lazy.Value или при вызове метода Lazy.ToString.

Используйте экземпляр Lazy, чтобы отложить создание большого или ресурсоемкого объекта или выполнение ресурсоемкой задачи, особенно когда такое создание или выполнение может не произойти в течение срока жизни программы. "

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

8 голосов
/ 21 июня 2011

Ознакомьтесь с документацией по msdn здесь: Ленивая инициализация

Ленивая инициализация объекта означает, что его создание откладывается до первого использования.Ленивая инициализация в основном используется для повышения производительности, предотвращения расточительных вычислений и снижения требований к памяти программ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...