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 для этого свойства. Будет ли проблема с тем, как я это реализовал? Я просто не уверен, что правильно его использую.
На самом деле нет смысла использовать ленивую загрузку, если у вас уже есть объект в памяти (в случае с сеттерами), но это совершенно нормально для этого. Одна вещь, о которой я могу думать, это если вы проверите _headshot.IsValueCreated
, она вернет false, даже если у вас уже есть объект в памяти. Другой альтернативой будет
private Image _headshot;
public Image Headshot
{
get { return _headshot ?? (_headshot = LoadHeadshotFromHDD()); }
set { _headshot = value; }
}
Это будет ленивая загрузка headshot при доступе к ресурсу, как при использовании Lazy<T>
, но она установит значение напрямую, поэтому вы можете проверить _headshot != null
_headshot.IsValueCreated
вместо _headshot.IsValueCreated
. Вы должны проверить сообщение Jon Skeet Singleton Pattern.
Выглядит хорошо, однако, если вы возьмете инициализацию конструктора, у вас может быть меньше кода.
public class Foo
{
public Foo()
{
this.Headshot = new Lazy<Image>( () => LoadHeadshotFromHDD );
}
public Lazy<Image> Headshot { get; set; }
}