初始化成员变量的最佳实践

时间:2014-10-08 07:13:11

标签: c# windows-services initialization

最好在构造函数中为服务初始化私有成员变量,如下所示:

public partial class DataPumpService : ServiceBase
{
    private TaskManager _taskManager;

    public DataPumpService()
    {
        InitializeComponent();
        _taskManager = new TaskManager();
    }

或者只是在课堂上这样:

public partial class DataPumpService : ServiceBase
{
    private TaskManager _taskManager = new TaskManager();

    public DataPumpService()
    {
        InitializeComponent();
    }

或者它没有区别吗?

2 个答案:

答案 0 :(得分:1)

确实有所不同。两者都在对象实例化时间内初始化(即您完全保证在其他代码对象被消耗之前将初始化类字段)。差异在于(a quote from MSDN):

  

类的实例字段变量初始值设定项对应于a   进入后立即执行的分配顺序   该类的任何一个实例构造函数(第10.10.1节)。   变量初始值设定项以文本顺序执行   它们出现在类声明中。

也就是说,如果你有一个像下面这样的类:

    public class A
    {
        public string text = "hello";

        public A()
        {
            text = "world";
        }
    }

...并且您创建了A的实例,text将保留world

在我的情况下,我根据用例使用这两种方法。无论如何,我倾向于在构造函数中进行初始化,以便快速发现类字段初始化的位置(因为其他类字段应该使用属性setter而不是类来初始化)直接领域......我错了!?)。

答案 1 :(得分:0)

这里几乎没有区别。使用哪种方式。

但是如果再添加一个带参数的构造函数。 class中的Initialize成员变量将为每个构造函数生成重复的IL代码。

因此,当有多个构造函数时,初始化的最佳方法是将公共初始化放在一个构造函数中,让其他构造函数通过this(...)调用此构造函数。