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。我实施此方式的方式是否会出现问题?我只是不确定我是否正确使用它。
答案 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; }
}