18

我想在我的实体中使用 System.Lazy 来延迟初始化我的列表:

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' has no setter

如果我想做什么MyInstance.Questions = new List<Question> { ... }

我该如何进行?

更新:

我试图避免这种情况:

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 } }

我做错了什么?

4

3 回答 3

26

你可以这样做:

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>这里。使用它没有任何好处,因为new的初始化List<T>应该和new的初始化一样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; }
}
于 2011-07-27T13:42:33.443 回答
6

目前尚不清楚您要做什么。你不能设置 a 的值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; } }
}
于 2011-07-27T13:40:47.867 回答
2

非惰性解决方案 - 仅在调用时才初始化的相同好处:

    private List<Question> _questions;
    public List<Question> Questions { get { return _questions ?? (_questions = new List<Question>()); } set { _questions = value; } }
于 2012-11-12T02:30:07.160 回答