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

Initializing lists inside properties vs. in the constructor?

我有一个对象,其属性公开了 List<>s。我通常在 属性 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()
    {
    }
}

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

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

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

这两种情况都会阻止 BarList 在初始化之前被访问。由于使用了自动属性,第二个看起来更简洁。不过,第一个似乎是更好的选择,因为列表仅在首次使用时才被初始化。还有其他我应该考虑的因素吗?有这方面的最佳实践吗?

如果您需要节省内存,惰性策略显然更好。如果该内存使用不重要,则急切策略会导致代码更简单。那就更可取了。

总的来说,排除特殊情况是一件好事。内部访问时list字段可以为null可不是什么好事

请注意,代码变得更短,C# 6 更倾向于更短的代码解决方案。

请注意,对于 getter.

的并发执行,惰性版本不是线程安全的

除了我们的回答,还有一个关于这个问题的答案,使用C# 6.0。

其中一项新功能是自动实现属性的初始值设定项。你会写:

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

此外,查看新的主构造函数,发现 a programmers.stackexchange article

此初始化器将在对象初始化时调用。在内存方面consumption/performance,应该等于在构造函数中初始化属性