C# 在 get 访问器中初始化对象

C# initialize object in get accessor

直到现在,我会创建一个名为 "Names" 的 属性 我们这样:

class Class1
{
    private string[] names;

    public string[] Names
    {
        get
        {
            return names;
        }

        set
        {
            names = value;
        }
    }

    Class1()
    {
        names = new string[] { "Peter", "John" };
    }
}

但最近我看到一些代码这样做:

class Class1
{
    private string[] names;

    public string[] Names
    {
        get
        {
            // Initialize object here
            if (names == null)
                names = new string[] { "Peter", "John" };

            return names;
        }

        set
        {
            names = value;
        }
    }

    Class1()
    {
        // No initialization here
    }
}

所以这些人所做的就是只在需要的时候创建一个实例。对我来说似乎是很好的编程实践,可以节省内存和周期。也有助于保持构造函数的整洁。 我试图获取更多信息,但偶然发现了 Lazy Initialization,它似乎做了几乎相同的事情。我的问题是,这是好的编程习惯吗?是否有一些我没有看到的陷阱,或者我是否可以愉快地适应这种做法?

有一个问题是构造函数是同步的,而 getter 不是。所以在多线程的情况下,get 可以初始化多个实例。