Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 首次使用时缓存属性_C#_.net_Caching - Fatal编程技术网

C# 首次使用时缓存属性

C# 首次使用时缓存属性,c#,.net,caching,C#,.net,Caching,我正在寻找一种仅在访问某个属性时填充该属性值的方法(即,因为在许多情况下,不需要获取该属性,而且获取该属性的成本很高)。出于演示目的,我用代码替换了fetch逻辑,只返回当前日期/时间;提供一种简单的方法来查看原始结果是否被缓存,或者同一代码是否被多次调用 我认为我使用的Lazy不正确,因为每次输出时,我都会得到不同的结果: void Main() { var d = new Demo(); Console.WriteLine(d.When); Thread.Sleep(

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

我认为我使用的
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,有点发疯了;谢谢。