Задержка создания объекта - PullRequest
1 голос
/ 14 октября 2011

Есть ли когда-нибудь случай, когда хранение необходимых данных для создания объекта и его создание только тогда, когда это абсолютно необходимо, лучше / эффективнее, чем проведение самого объекта?

Тривиальный пример:

class Bar
{
    public string Data { get; set; }
}

class Foo
{
    Bar bar;
    readonly string barData;

    public Foo(string barData)
    {
        this.barData = barData;
    }

    public void MaybeCreate(bool create)
    {
        if (create)
        {
            bar = new Bar { Data = barData };
        }
    }

    public Bar Bar { get { return bar; } }
}

Ответы [ 3 ]

3 голосов
/ 14 октября 2011

Имеет смысл, если объект выполняет некоторую сложную операцию при построении, например, выделяет системные ресурсы.

У вас есть Lazy<T>, чтобы помочь вам отложить создание объекта. Помимо прочего, в него встроена защита потоков, если вам это нужно.

3 голосов
/ 14 октября 2011

В общем, нет.(Если я правильно понимаю ваш вопрос).

Распределения / конструкции дешевы с точки зрения производительности.Если вы не делаете что-то сумасшедшее, создавайте свои объекты, когда это кажется естественным для дизайна - не оптимизируйте преждевременно.

1 голос
/ 14 октября 2011

Да, если создание объекта означает его заполнение, и для его заполнения необходимо выполнить медленную операцию.

Например,

List<int> ll = returnDataFromDBVeryVerySlowly();

или

Lazy<List<int>> ll = new Lazy<List<int>>(() =>
{
    return returnDataFromDBVeryVerySlowly();
});

В первом примере returnDataFromDBVeryVerySlowly будет вызываться всегда, даже если вам это не нужно. Во втором он будет вызываться только в случае необходимости. Это довольно распространено, например, в ASP.NET, где вы хотите иметь «готовые» многие «стандартные» наборы данных, но вы не хотите, чтобы они заполнялись, если они не нужны, и вы хотите поместить их в качестве членов вашего Page, так что несколько методов могут получить к ним доступ (в противном случае метод может вызывать напрямую returnDataFromDBVeryVerySlowly)

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