【发布时间】: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 哪里出了问题/为什么我会每次我在原始代码中调用该属性时看到返回的值不同?
【问题讨论】:
-
=>是一个“表达式主体”语法,表示返回DateTime.Now的属性getter