【问题标题】:Caching a property on first use [closed]首次使用时缓存属性[关闭]
【发布时间】:2018-03-13 02:43:14
【问题描述】:

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

我认为我使用 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 解决方案,并且误解了 Lazy 的工作原理/应该使用的一些基本内容...谁能告诉我 Lazy 哪里出了问题/为什么我会每次我在原始代码中调用该属性时看到返回的值不同?

【问题讨论】:

标签: c# .net caching


【解决方案1】:

你必须在行中使用= 而不是=&gt;

Lazy&lt;DateTime&gt; when = new Lazy&lt;DateTime&gt;(() =&gt; DateTime.UtcNow); //=, no =&gt;

【讨论】:

  • 啊;完全有道理;我的脑子里充满了 lambda,以至于我有点忘乎所以;谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多