在属性内部初始化列表与在构造函数中初始化列表

本文关键字:列表 初始化 构造函数 属性 内部 | 更新日期: 2023-09-27 18:03:27

我有一个通过属性暴露的具有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()
    {
    }
}

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

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

这两种情况都防止BarList在初始化之前被访问。由于使用了自动属性,第二种方法看起来更简洁。第一个似乎是更好的选择,因为列表只在第一次使用时初始化。还有什么我需要考虑的吗?有没有最佳实践?

在属性内部初始化列表与在构造函数中初始化列表

除了用户的回答之外,还有另一个答案,使用c# 6.0来回答这个问题。

其中一个新特性是自动实现属性的初始化器。你会写:
public class Foo
{
    public List<bar> BarList { get; set; } = new List<bar>();
}

另外,看一下新的主构造函数,发现了一个程序员。课件。

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

如果需要节省内存,那么lazy策略显然更好。如果内存使用不重要,那么急切策略会使代码更简单。这样比较好。

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

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

注意,对于并发执行getter, lazy版本不是线程安全的。