这是使用.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。我实现这个的方式会有问题吗?我只是不确定我是否正确使用它
如果您已经在内存中拥有对象(在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; }
}