gpt4 book ai didi

c# - 在第一次使用时缓存属性

转载 作者:行者123 更新时间:2023-11-30 21:35:23 25 4
gpt4 key购买 nike

<分区>

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

我认为我错误地使用了 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 哪里出了问题/我为什么每次我在原始代码中调用该属性时,是否看到返回的值不同?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com