Я ищу способ заполнить значение свойства только при доступе к этому свойству (т. Е. Поскольку во многих случаях извлечение свойства не требуется, а затраты на его получение являются дорогостоящими). В демонстрационных целях я заменил свою логику выборки на код, который просто возвращает текущую дату / время; давая простой способ узнать, кэширован ли исходный результат или один и тот же код был вызван несколько раз.
Я думаю, что использую Lazy неправильно, так как каждый раз, когда я выводю When, получаю разные результаты:
void Main()
{
var d = new Demo();
Console.WriteLine(d.When);
Thread.Sleep(1000);
Console.WriteLine(d.When);
Thread.Sleep(1000);
Console.WriteLine(d.When);
Thread.Sleep(1000);
Console.WriteLine(d.When);
}
class Demo
{
public Demo(){}
Lazy<DateTime> when => new Lazy<DateTime>(() => DateTime.UtcNow);
public DateTime When
{
get
{
return when.Value;
}
}
}
При исследовании я нашел аналогичный вопрос / ответ: C# Автоматические свойства с отложенной загрузкой
В случае, если я каким-то образом злоупотреблял анонимными функциями, я попробовал:
static DateTime OnlyOnce()
{
return DateTime.UtcNow;
}
//...
Lazy<DateTime> when => new Lazy<DateTime>(OnlyOnce);
... но с таким же эффектом.
Я получил эту работу, выполнив следующие действия:
class Demo
{
public Demo(){}
Nullable<DateTime> when;
public DateTime When
{
get
{
//return (when = when ?? DateTime.UtcNow) ?? DateTime.MinValue; //previous hack to switch from Nullable to DateTime
return (when = when ?? DateTime.UtcNow).Value //cleaner way to do this conversion
}
}
т.е. если when заполнен, мы присваиваем его самому себе и возвращаем это значение; в противном случае мы назначаем DateTime.UtcNow на when, а затем возвращаем его.
Однако я чувствую, что придумал хакерское решение и неправильно понял кое-что о том, как Lazy работает / должен использоваться ... Может ли кто-нибудь сообщить мне, где я ошибаюсь с Lazy / почему я вижу другое значение, возвращаемое каждый раз, когда я вызываю это свойство в исходном коде?
Возможный дубликат C# Автоматические свойства с отложенной загрузкой





Вы должны использовать = вместо => в строке:
Lazy<DateTime> when = new Lazy<DateTime>(() => DateTime.UtcNow); //=, no =>
Ах; полностью имеет смысл; в моей голове было столько лямбд, что я немного увлекся; Спасибо.
=>- это синтаксис «тела выражения», представляющий средство получения свойства, которое возвращаетDateTime.Now.