在属性和构造函数中初始化列表?

时间:2015-07-20 09:44:01

标签: c# properties constructor

我有一个List<>属性公开的对象。我通常在属性getter中初始化我的列表,如下所示:

public class Foo
{
    private List<bar> _barList;

    public List<bar>
    {
        get
        {
            if(_barList == null)
            {
                _barList = new List<Bar>()
            }

            return _barList;
        }

        set
        {
            _barList = value;
        }
    }

    public Foo()
    {
    }
}

但是,我的同事通常更喜欢在类构造函数中初始化列表,如下所示:

public class Foo
{
    public List<bar> BarList { get; set; }

    public Foo()
    {
        BarList = new List<Bar>();
    }
}

这两种情况都会阻止BarList在初始化之前被访问。由于使用autoproperties,第二个似乎更整洁。第一个似乎是一个更好的选择,因为列表仅在首次使用时初始化。我还应该考虑其他因素吗?这是最好的做法吗?

2 个答案:

答案 0 :(得分:5)

如果你需要保存记忆,那么懒惰的策略显然会更好。如果内存使用不重要,那么急切的策略会导致更简单的代码。那么最好是。

一般来说,消除特殊情况是一件好事。对于内部访问,list字段可以为null,这不是一件好事。

请注意,使用C#6可以缩短代码,从而更倾向于更短的代码解决方案。

请注意,延迟版本对于并发执行getter而言不是线程安全的。

答案 1 :(得分:4)

除了我们的回答之外,还有另一个答案,使用C#6.0来解决这个问题。

其中一项新功能是自动实现属性的初始化程序。你写的是:

public class Foo
{
    public List<bar> BarList { get; set; } = new List<bar>();
}

另外,查看新的主要构造函数,找到a programmers.stackexchange article

将在对象初始化时调用此初始化程序。在内存消耗/性能方面,它应该等于在构造函数中初始化属性。