Это не ленивый груз. Это инициализация на строительстве. Обычно в ленивой загрузке мы подразумеваем конструирование элемента при первом обращении к нему.
private string _someField;
public string SomeField
{
get
{
// we'd also want to do synchronization if multi-threading.
if (_someField == null)
{
_someField = new String('-', 1000000);
}
return _someField;
}
}
Раньше одним из типичных способов Lazy загрузки была проверка, блокировка, проверка, чтобы не блокировать, если она уже создана, но поскольку два элемента могут пройти проверку и дождаться блокировки Проверяешь снова в замке:
public class SomeClass
{
private string _someField;
private readonly object _lazyLock = new object();
public string SomeField
{
get
{
// we'd also want to do synchronization if multi-threading.
if (_someField == null)
{
lock (_lazyLock)
{
if (_someField == null)
{
_someField = new String('-', 1000000);
}
}
}
return _someField;
}
}
}
Существуют различные способы сделать это, на самом деле в .NET 4.0 есть тип Lazy<T>
, который может помочь вам легко выполнять потоковую ленивую загрузку.
public class SomeClass
{
private readonly Lazy<string> _someField = new Lazy<string>(() => new string('-', 10000000), true);
private readonly object _lazyLock = new object();
public string SomeField
{
get
{
return _someField.Value;
}
}
}
Что касается того, почему, как правило, ленивая загрузка является хорошей схемой, если создаваемый вами объект имеет тенденцию быть дорогим (память или время), и нет никакой гарантии, что он вам понадобится. Если вы достаточно уверены, что он всегда будет использоваться, то вам следует просто создать его прямо.