初始化显式构造函数之外的字段是不好的做法

Joh*_*las 12 c# constructor initialization

可能重复:
在构造函数或声明中初始化类字段?

我们正在争论编码实践.这里的例子有点过于简单,但真正的交易有几个构造函数.为了初始化简单值(例如日期到它们的最小值),我已经将代码移出构造函数并进入字段定义.

public class ConstructorExample
{
    string _string = "John";
}

public class ConstructorExample2
{
    string _string;

    public ConstructorExample2()
    {
        _string = "John";
    }
}
Run Code Online (Sandbox Code Playgroud)

这本书怎么做?我倾向于非常具体,所以对这种事情可能有点松懈.但是我觉得occams razor告诉我将初始化移出多个构造函数.当然,我总是可以将这个共享初始化转移到私有方法中.

问题本质上是...正在初始化定义它们的字段而不是构造函数以任何方式变坏?

我所面临的论点是错误处理之一,但我不认为它是相关的,因为没有可能的异常在编译时不会被接收.

ang*_*son 17

请注意,对于每个构造函数链,所有此类字段声明级初始化都将执行一次,即使构造函数本身将字段设置为其他内容也是如此.

如果将构造函数链接在一起,则将在调用的common,first构造函数中初始化字段.

看看这个例子:

using System;

namespace ClassLibrary3
{
    public class Class1
    {
        private string _Name = "Lasse";

        public Class1()
        {
        }

        public Class1(int i)
            : this()
        {
        }

        public Class1(bool b)
        {
            _Name = "Test";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此代码编译如下:

using System;

namespace ClassLibrary3
{
    public class Class1
    {
        private string _Name;

        public Class1()
        {
            _Name = "Lasse"
        }

        public Class1(int i)
            : this()
        {
            // not here, as this() takes care of it
        }

        public Class1(bool b)
        {
            _Name = "Lasse"
            _Name = "Test";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


kem*_*002 14

初始化构造函数之外的值并不一定是坏的,这里有你遇到的问题:

 string _string;

    public ConstructorExample2()
    {
        _string = "John";
    }
Run Code Online (Sandbox Code Playgroud)

如果您有多个构造函数,则必须记住
1.在每个构造函数中重新初始化_string
2.将逻辑分离为一个公共方法并在每个构造函数中调用该方法
3.使用其中的逻辑调用构造函数,从其他建设者.(链接构造函数)
现在这不一定是问题,但你必须记住这样做.通过在构造函数之外初始化它,它就完成了.这是你需要记住的一件事.

  • 您不需要在每个构造函数中重新初始化_string.相反,你可以使用`public MyClass():this(String.Empty)`链接ctors (8认同)