猿问

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

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

我最近一直在用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()
    {
        // .....
    }}

我真的很好奇你们中的一些老兵认为什么是最好的做法。我想保持一致,坚持一种方法。


慕的地6264312
浏览 648回答 3
3回答

阿波罗的战车

在C#中,这并不重要。您给出的两个代码示例完全等价。在第一个示例中,C#编译器(还是CLR?)将构造一个空构造函数并初始化变量,就像它们在构造函数中一样(JonSkeet在下面的注释中解释了其中的细微差别)。如果已经有一个构造函数,那么“上面”的任何初始化都将移到它的顶部。就最佳实践而言,前者比后者更容易出错,因为有人可以轻松地添加另一个构造函数,而忘记将其链接起来。

喵喵时光机

这里,C#的语义与Java略有不同。在C#中,声明中的赋值在调用超类构造函数之前执行。在Java中,这是紧接着进行的,允许使用“this”(对于匿名内部类特别有用),这意味着这两种表单的语义确实匹配。如果可以的话,把字段变成最后的。

守着星空守着你

我的规则:不要用声明中的默认值初始化(null, false, 0, 0.0…).如果没有更改字段值的构造函数参数,则更喜欢声明中的初始化。如果字段的值由于构造函数参数而发生变化,则将初始化放在构造函数中。在实践中保持一致(最重要的规则)。
随时随地看视频慕课网APP
我要回答