Кеширование свойства при первом использовании

Я ищу способ заполнить значение свойства только при доступе к этому свойству (т. Е. Поскольку во многих случаях извлечение свойства не требуется, а затраты на его получение являются дорогостоящими). В демонстрационных целях я заменил свою логику выборки на код, который просто возвращает текущую дату / время; давая простой способ узнать, кэширован ли исходный результат или один и тот же код был вызван несколько раз.

Я думаю, что использую 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 / почему я вижу другое значение, возвращаемое каждый раз, когда я вызываю это свойство в исходном коде?

=> - это синтаксис «тела выражения», представляющий средство получения свойства, которое возвращает DateTime.Now.
Rufus L 12.03.2018 19:42

Возможный дубликат C# Автоматические свойства с отложенной загрузкой

Rufus L 12.03.2018 19:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны использовать = вместо => в строке:

Lazy<DateTime> when = new Lazy<DateTime>(() => DateTime.UtcNow); //=, no =>

Ах; полностью имеет смысл; в моей голове было столько лямбд, что я немного увлекся; Спасибо.

JohnLBevan 12.03.2018 19:43

Другие вопросы по теме