Это хороший способ использования .NET System.Lazy

1
    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 для этого свойства. Будет ли проблема с тем, как я это реализовал? Я просто не уверен, что правильно его использую.

Теги:
lazy-loading

2 ответа

4
Лучший ответ

На самом деле нет смысла использовать ленивую загрузку, если у вас уже есть объект в памяти (в случае с сеттерами), но это совершенно нормально для этого. Одна вещь, о которой я могу думать, это если вы проверите _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.

  • 0
    Это путь.
  • 0
    Альтернативный метод не будет работать во всех случаях - допустим, что null является допустимым значением. Если для Headshot установлено значение NULL, а затем выполняется чтение через некоторое время, этот метод будет возвращать данные с жесткого диска вместо NULL.
0

Выглядит хорошо, однако, если вы возьмете инициализацию конструктора, у вас может быть меньше кода.

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

    public Lazy<Image> Headshot { get; set; }
}
  • 0
    Спасибо, но это не совсем то, что я хотел. Я думаю, что свойство должно иметь тип Image, а не Lazy <Image>. Если тип свойства Lazy <Image>, вы не можете просто назначить ему изображение - каждый раз, когда вам нужно создать экземпляр Lazy.
  • 0
    Нет проблем, это ваше дизайнерское решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню