首次使用时缓存属性

时间:2018-03-12 18:30:40

标签: c# .net caching

我正在寻找一种方法,只有在访问该属性时才填充属性的值(即,因为在许多情况下,不需要获取属性,并且获取它的成本很高)。出于演示目的,我用代码替换了我的获取逻辑,只返回当前日期/时间;给出一种简单的方法来查看原始结果是否被缓存,或者多次调用相同的代码。

我认为我正在使用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# Lazy Loaded Automatic Properties

如果我在某种程度上滥用匿名函数,我试过:

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然后返回。

然而,我觉得我已经提出了一个hacky解决方案&amp;我误解了一些关于懒惰如何工作/应该被使用的基本信息...任何人都可以告诉我我在哪里懒惰/为什么我每次打电话给我的房产时都会看到不同的值原始代码?

1 个答案:

答案 0 :(得分:3)

您必须在行中使用=而不是=>

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