Какие преимущества Lazy предлагает по сравнению со стандартным lazy instantiation?
рассмотрим этот пример, он показывает два возможных способа ленивой инициализации. Кроме того потокобезопасным, есть какие-то конкретные advantates с помощью ленивых здесь?
class Customer {
private decimal? _balance2;
private static decimal GetBalanceOverNetwork() {
//lengthy network operations
Thread.Sleep(2000);
return 99.9M;
}
public decimal? GetBalance2Lazily() {
return _balance2 ?? (_balance2 = GetBalanceOverNetwork());
}
private readonly Lazy<decimal> _balance1 = new Lazy<decimal>(GetBalanceOverNetwork);
public Lazy<decimal> Balance1 {
get { return _balance1; }
}
}
обновление:
рассмотрите приведенный выше код как простой пример, типы данных не имеют значения, здесь нужно сравнить Lazy над стандартной ленивой инициализацией.
1 ответов
это семантически более правильным.
при использовании Nullable<decimal>
, вы говорите, что значение null
будет означать состояние "unevaluated". Хотя это обычное преобразование, оно все же произвольно. Есть миллион других способов интерпретировать null
, поэтому вы, вероятно, должны объяснить где-нибудь (в документации или, по крайней мере, в качестве комментария), что означает null в этом случае.
наоборот, когда вы используете Lazy<decimal>
, ваши намерения ясны.