在构造函数或声明中初始化类字段?

问题

我最近一直在用C#和Java编程,我很好奇最好的地方是初始化我的类字段。

我应该在申报时做到吗?:

public class Dice
{
    private int topFace = 1;
    private Random myRand = new Random();

    public void Roll()
    {
       // ......
    }
}

或者在构造函数中?:

public class Dice
{
    private int topFace;
    private Random myRand;

    public Dice()
    {
        topFace = 1;
        myRand = new Random();
    }

    public void Roll()
    {
        // .....
    }
}

我真的很好奇你们有些人认为最好的做法。我想保持一致并坚持一种方法。


#1 热门回答(242 赞)

我的规则:

  • 不要使用声明中的默认值进行初始化(null,false,0,0.0 ...)。
  • 如果你没有更改字段值的构造函数参数,则首选声明中的初始化。
  • 如果由于构造函数参数而改变字段的值,则将初始化放在构造函数中。
  • 在练习中保持一致(最重要的规则)。

#2 热门回答(133 赞)

在C#中没关系。你提供的两个代码示例完全相同。在第一个例子中,C#编译器(或它是CLR?)将构造一个空构造函数并初始化变量,就像它们在构造函数中一样。如果已经有一个构造函数,那么任何初始化"上面"将被移动到它的顶部。

就最佳实践而言,前者比后者更不容易出错,因为有人可能很容易添加另一个构造函数而忘记链接它。


#3 热门回答(13 赞)

C#的语义与Java略有不同。在C#中,声明中的赋值是在调用超类构造函数之前执行的。在Java中,它立即完成,允许使用'this'(对于匿名内部类特别有用),并且意味着两个表单的语义确实匹配。

如果可以,请将字段设为最终字段。