为什么Lazy <T>不懒惰?

Jam*_*Ide 1 c# lazy-initialization

我有几个简单的数据库查询使用Entity Framework我想加载一次,Lazy<T>但我可以看到每次调用属性时执行查询.我尝试的变化是:

public static IEnumerable<string> Foos => new Lazy<IEnumerable<string>>(() => _db.Foos.Select(x => x.Name)).Value;

public static IEnumerable<string> Foos=> new Lazy<IEnumerable<string>>(() => _db.Foos.Select(x => x.Name).ToArray()).Value;

public static Lazy<IEnumerable<string>> Foos => new Lazy<IEnumerable<string>>(() => _db.Foos.Select(x => x.Name).ToArray());

public static IEnumerable<string> LightingEnvironments
{
    get
    {
        var lazy = new Lazy<IEnumerable<string>>(() => _db.Foos.Select(x => x.Name).ToArray());
        return lazy.Value;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 9

Lazy每次调用属性getter时,您都在构建一个新的.A Lazy只允许您重新使用已构造的值,如果您保留Lazy实例每次需要该值时在同一实例调用该Value属性.Lazy