我正在寻找一种方法,只有在访问该属性时才填充属性的值(即,因为在许多情况下,不需要获取属性,并且获取它的成本很高)。出于演示目的,我用代码替换了我的获取逻辑,只返回当前日期/时间;给出一种简单的方法来查看原始结果是否被缓存,或者多次调用相同的代码。
我认为我正在使用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;我误解了一些关于懒惰如何工作/应该被使用的基本信息...任何人都可以告诉我我在哪里懒惰/为什么我每次打电话给我的房产时都会看到不同的值原始代码?
答案 0 :(得分:3)
您必须在行中使用=
而不是=>
:
Lazy<DateTime> when = new Lazy<DateTime>(() => DateTime.UtcNow); //=, no =>