这是使用.net 's System.Lazy的好方法吗?

本文关键字:Lazy System 方法 net | 更新日期: 2023-09-27 18:03:55

    private Lazy<Image> _headshot = new Lazy<Image>(LoadHeadshotFromHDD);
    public Image Headshot
    {
        get
        {
            return _headshot.Value;
        }
        set
        {
            _headshot = new Lazy<Image>(() => value);
        }
    }

假设我有一个Person类并且Headshot属性在这个类中。Headshot是从硬盘上加载的,所以我希望它是懒惰的,但我也想实现该属性的setter。我实现这个的方式会有问题吗?我只是不确定我是否正确使用它

这是使用.net 's System.Lazy的好方法吗?

如果您已经在内存中拥有对象(在setter的情况下),那么使用延迟加载确实没有意义,但是这样做是完全可以的。我能想到的一件事是,如果你检查_headshot.IsValueCreated,它会返回false,即使你已经在内存中有了这个对象。另一个选项是

private Image _headshot;
public Image Headshot
{
    get { return _headshot ?? (_headshot = LoadHeadshotFromHDD()); }
    set { _headshot = value; }
}

这将在访问属性时延迟加载头像,就像使用Lazy<T>一样,但它会直接设置值,所以你可以检查_headshot != null而不是_headshot.IsValueCreated。你应该看看Jon Skeet的单例模式文章

看起来不错,但是,如果您对构造函数进行初始化,则可以减少代码。

public class Foo
{
    public Foo()
    {
        this.Headshot = new Lazy<Image>( () => LoadHeadshotFromHDD );
    }
    public Lazy<Image> Headshot { get; set; }
}