Как использовать System.Lazy с сеттером для ленивой инициализации списка в объектах POCO?

Я хочу использовать System.Lazy для ленивой инициализации моего списка в моих Entites:

public class Questionary
{
    private Lazy<List<Question>> _questions = new Lazy<List<Question>>(() => new List<Question>());

    public IList<Question> Questions { get { return _questions.Value; } set { _questions.Value = value; } }
}

Проблема в моем SETTER, получить эту ошибку: Свойство 'System.Lazy<T>.Value' не имеет настройки

Если я хочу сделать MyInstance.Questions = new List<Question> { ... }?

Как мне продолжить?

Update:

Я пытаюсь избежать этого:

private IList<Question> _questions;

//Trying to avoid that ugly if in my getter:
public IList<Question> Questions { get { return _questions == null ? new List<Question>() : _questions; } set { _questions = value } }

Я делаю что-то неправильно?

Ответы

Ответ 1

Вы можете сделать что-то вроде этого:

public class Questionary
{
    private Lazy<IList<Question>> _questions = 
        new Lazy<IList<Question>>(() => new List<Question>());

    public IList<Question> Questions
    {
        get { return _questions.Value; }
        set { _questions = new Lazy<IList<Question>>(() => value); }
    }
}

Однако я не понимаю, зачем вам нужно Lazy<T> здесь вообще. Нет никакой пользы в ее использовании, поскольку инициализация нового List<T> должна быть такой же, как инициализация нового Lazy<T>...

Я думаю, этого было бы достаточно, чтобы это было так просто:

public class Questionary
{
    private IList<Question> _questions = new List<Question>();

    public IList<Question> Questions
    {
        get { return _questions; }
        set { _questions = value; }
    }
}

или

public class Questionary
{
    public Questionary()
    {
        Questions = new List<Question>();
    }

    public IList<Question> Questions { get; set; }
}

Ответ 2

Не понятно, что вы пытаетесь сделать. Вы не можете установить значение Lazy<T> - это так просто. Вы можете запросить только его значение, и он выполнит делегат, который вы предоставили при первом запросе значений.

Вам действительно нужен сеттер в вашем классе? Возможно, вы просто хотите:

public class Questionary
{
    private Lazy<List<Question>> _questions = 
        new Lazy<List<Question>>(() => new List<Question>());

    public IList<Question> Questions { get { return _questions.Value; } }
}

Ответ 3

Неладовое решение - такое же преимущество при инициализации только при вызове:

    private List<Question> _questions;
    public List<Question> Questions { get { return _questions ?? (_questions = new List<Question>()); } set { _questions = value; } }