Какие преимущества предлагает ленивый по сравнению с стандартным ленивым экземпляром?
-
25-10-2019 - |
Вопрос
Рассмотрим этот пример, он показывает два возможных способа ленивой инициализации. За исключением того, чтобы быть защищенным потоком, существуют ли какие-либо конкретные преимущества использования ленивыхu003CT> здесь?
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; }
}
}
ОБНОВИТЬ:
Пожалуйста, рассмотрите выше кода как простой пример, типы данных не имеют значения, то есть здесь состоит в том, чтобы сравнить ленивыйu003CT> над стандартной ленивой инициализацией.
Решение
Это семантически правильно.
Когда вы используете Nullable<decimal>
, вы говорите, что ценность null
будет стоять для «неоценка» состояния. Хотя это общее преобразование, оно все еще произвольное. Есть миллион других способов интерпретировать null
, Так вы, вероятно, должны где -то объяснить (в документации или, по крайней мере, как комментарий), что нулевое означает в этом случае.
Напротив, когда вы используете Lazy<decimal>
, ваши намерения ясны.