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

标签 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在初始化之前被访问。由于使用了自动属性,第二个看起来更简洁。不过,第一个似乎是更好的选择,因为列表仅在首次使用时才被初始化。还有其他我应该考虑的因素吗?有这方面的最佳实践吗?

最佳答案

除了usrs answer之外,还有一个关于这个问题的答案,使用C# 6.0。

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

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

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

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

关于c# - 在属性中初始化列表还是在构造函数中初始化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31513281/

相关文章:

c# - 寻找 C# 或 curl 示例如何在 SendGrid 更新 HTML 模板

c# - 所有类的变量相同

java - Spring 上下文 XML 中的属性未解析

javascript - Javascript 中 value.x 和 value[x] (从数组获取属性)之间的区别?

java - 有没有办法将属性文件中的所有属性作为 JVM 参数传递?

c++ - 没有默认构造函数的对象数组初始化

c# - 在多个线程中重复使用单个HttpClient时,套接字用完了-仍然有1000个TIMED_WAIT连接

用于 MS Word 公式编辑器的 C# API

c++ - 我们可以在 C++ 的构造函数中调用 exit() 吗?

java - 无参数构造函数的目的是什么?