为什么成员变量在构造函数中初始化?

Kdg*_*Dev 5 oop initialization declaration

当我第一次开始使用面向对象的编程语言时,我被教导了以下规则:

在类中声明字段时,不要初始化它.在构造函数中执行此操作.

C#中的一个例子:

public class Test
{
    private List<String> l;

    public Test()
    {
        l = new List<String>();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当有人最近问我为什么这样做时,我无法想出一个理由.我并不熟悉C#(或其他编程语言)的内部工作原理,因为我相信这可以在所有OO语言中完成.

那么,为什么是这样呢?安全吗?属性?

Mic*_*rdt 14

  • 如果您有多个构造函数,则可能需要将字段初始化为不同的值

  • 在构造函数中初始化字段时,对于何时根据构造函数的其余部分进行初始化,不会产生混淆.对于单个类来说,这似乎是微不足道的,但是如果你有一个继承层次结构,并且在每个级别运行构造函数代码并访问超类字段,那么这一点就不那么简单了.


And*_*are 10

C#编译器将采用您内联的任何非静态成员初始化,并将其移动到构造函数中.换句话说:

class Test
{
    Object o = new Object();
}
Run Code Online (Sandbox Code Playgroud)

汇编到这个:

class Test
{
    Object o;

    public Test()
    {
        this.o = new Object();
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定其他语言的编译器如何处理这个问题,但就C#而言,这是一个风格问题,你可以自由地做任何你想做的事情. 请注意,静态字段的处理方式不同:请 阅读本文以获取更多相关信息.