C# 首次使用时缓存属性
我正在寻找一种仅在访问某个属性时填充该属性值的方法(即,因为在许多情况下,不需要获取该属性,而且获取该属性的成本很高)。出于演示目的,我用代码替换了fetch逻辑,只返回当前日期/时间;提供一种简单的方法来查看原始结果是否被缓存,或者同一代码是否被多次调用 我认为我使用的C# 首次使用时缓存属性,c#,.net,caching,C#,.net,Caching,我正在寻找一种仅在访问某个属性时填充该属性值的方法(即,因为在许多情况下,不需要获取该属性,而且获取该属性的成本很高)。出于演示目的,我用代码替换了fetch逻辑,只返回当前日期/时间;提供一种简单的方法来查看原始结果是否被缓存,或者同一代码是否被多次调用 我认为我使用的Lazy不正确,因为每次输出时,我都会得到不同的结果: void Main() { var d = new Demo(); Console.WriteLine(d.When); Thread.Sleep(
Lazy
不正确,因为每次输出时,我都会得到不同的结果:
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;
}
}
}
void Main()
{
var d=新的Demo();
控制台写入线(d.When);
睡眠(1000);
控制台写入线(d.When);
睡眠(1000);
控制台写入线(d.When);
睡眠(1000);
控制台写入线(d.When);
}
课堂演示
{
公共演示(){}
Lazy-when=>new-Lazy(()=>DateTime.UtcNow);
公共日期时间
{
得到
{
当.Value时返回;
}
}
}
在研究中,我发现了一个类似的问题/答案:
如果我不知何故误用了匿名函数,我尝试了:
static DateTime OnlyOnce()
{
return DateTime.UtcNow;
}
//...
Lazy<DateTime> when => new Lazy<DateTime>(OnlyOnce);
static DateTime OnlyOnce()
{
return DateTime.UtcNow;
}
//...
Lazy when=>新的Lazy(仅限一次);
…但效果相同
我通过以下操作实现了这一点:
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
}
}
类演示
{
公共演示(){}
可为空时;
公共日期时间
{
得到
{
//return(when=when??DateTime.UtcNow)??DateTime.MinValue;//上一个从null切换到DateTime的方法
return(when=when??DateTime.UtcNow).Value//cleaner执行此转换的方法
}
}
i、 e.如果填充了时,我们将其分配给自身并返回该值;如果没有,我们将日期时间.UtcNow
分配给时,然后返回该值
然而,我觉得我已经想出了一个骇人的解决方案&误解了一些关于Lazy如何工作/应该如何使用的基本概念……有人能告诉我Lazy哪里出了问题/为什么每次我在原始代码中调用该属性时都会返回不同的值吗?你必须使用=
而不是ode>=>
行中:
Lazy when=new Lazy(()=>DateTime.UtcNow);//=,no=>
=>
是一种“表达式体”语法,它表示返回DateTime的属性获取程序。现在,
可能与Ah重复;完全有意义;我的脑袋里塞满了lambdas,有点发疯了;谢谢。