这是使用.NET的System.Lazy的好方法吗?

时间:2014-05-17 20:25:39

标签: c# .net lazy-loading

    private Lazy<Image> _headshot = new Lazy<Image>(LoadHeadshotFromHDD);

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

我们说我有一个Person类,Headshot属性在该类中。 Headshot从HDD加载,所以我希望它是懒惰的,但我也想为该属性实现setter。我实施此方式的方式是否会出现问题?我只是不确定我是否正确使用它。

2 个答案:

答案 0 :(得分:4)

如果你已经在内存中设置了对象(在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的Singleton Pattern post

答案 1 :(得分:0)

看起来没问题,但是,如果您将初始化带到构造函数中,那么代码可能会更少。

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

    public Lazy<Image> Headshot { get; set; }
}