为什么懒惰<受限于静态上下文

本文关键字:静态 上下文 于静态 为什么 | 更新日期: 2023-09-27 18:01:58

我想使用Lazy T来实现记忆,但是初始化函数似乎需要一个静态上下文。

例如,下面的代码拒绝编译,并警告非静态成员ab不可访问。我不清楚为什么会这样,因为Lazy对象本身就是一个实例成员,并且在静态上下文中没有可见性。
public class SomeExpensiveCalculation
{
    private int a;
    private int b;
    public Lazy<int> Result = new Lazy<int>(() => a + b); //nope!
}

为什么懒惰<受限于静态上下文

构造函数(或方法)外部的对象初始化式只能引用静态成员。这是因为在构造函数运行之前实例还没有被构造,因此字段还没有"准备好",因此不能被引用。静态字段之所以有效,是因为它们在字段之前被初始化。

请注意,错误不是由Lazy<T>引起的,而是由lambda表达式引起的。解决方法(也是正确的方法)是在构造函数中初始化Result

我不知道为什么你的代码不工作,但这应该工作:

    public class SomeExpensiveCalculation
    {
        private int a;
        private int b;
        public Lazy<int> Result;
        public SomeExpensiveCalculation()
        {
             Result = new Lazy<int>(() => a + b);
        }
    }

继续讨论@Ondra的答案,这也可以用于注入工厂。一个警告——小心懒人和工厂的相对寿命:

public class SomeClass
{
  private readonly Lazy<ISomeDependency> _lazyField;
  // Ctor
  public SomeClass(ISomeFactory factory)
  {
     _lazyField = new Lazy<ISomeDependency>(() => factory.Create());
  }
}