10

new构造函数和new成员声明有什么区别?

例子

public class PspGame {

  private List<string>name = new List<string>();
  private List<string>_value;

  public PspGame() {
    _value = new List<string>();
  }
}

最好的方法是什么,是否存在任何性能问题?

4

5 回答 5

11

它们几乎是等价的(性能和内存使用方面的任何差异都可以忽略不计)。唯一真正的区别是当你这样做时:

private List<string>name = new List<string>();

...无论使用什么构造函数来创建对象的实例,分配总是会发生。当您在构造函数中进行赋值时,只有在使用该特定构造函数时才会发生。

因此,如果您有多个构造函数,但您总是希望以name完全相同的方式进行初始化,那么使用第一种形式比在每个构造函数中显式初始化它要短一些。

然而,作为一般规则,我更喜欢在构造函数实现中初始化字段,即使在某些情况下它确实会使代码更加冗长。

于 2012-05-13T23:31:38.667 回答
4

对我来说,在构造函数(非默认构造函数)中有一个参数可以进行更好的测试。您可以将某些数据“注入”到成员字段中,如果不将该成员公开(或至少是内部的)或使用“setter”属性进行第二次调用,您不一定能够做到这一点。

因为你可以有多个构造函数,如果你真的想要的话,你可以有第二个用于测试,结合默认构造函数。

没有任何真正的性能问题,除了必须在以后进行单独调用以填充数据,或者具有对类的多次调用(一个用于创建对象,第二个用于填充成员)的可维护性较差的代码。

编辑:我意识到我有点回答了错误的问题。我以为他在问默认构造函数和非默认构造函数之间的区别。现在我看到它是关于一个默认构造函数,它在构造函数与成员声明中初始化成员......

于 2012-05-13T23:29:38.073 回答
1

两者是等价的。编译器将任何此类成员的初始化移动到构造函数(如果成员是静态的,则为静态构造函数)。我不会说有一种通用的最佳方式来做到这一点——只要在可能的情况下保持一致,如果在这种情况下更有意义,那就使用它。

于 2012-05-13T23:30:30.283 回答
1

在构造函数中初始化实例成员,在声明中初始化类成员。AFAIK 这是(仅)约定,并且没有性能损失。恕我直言,这应该被强制纳入语言规则(语法/语义)。

于 2012-05-13T23:30:49.087 回答
1

在构造函数中初始化字段也可以避免这个问题:

class MyClass
{
    private List<string> _list = new List<string>();
    public MyClass()
    {
        //some logic here
    }
    public MyClass(List<string> initialList) : this()
    {
        _list = initialList;
    }
}

使用此代码,如果您调用第二个构造函数,您将不必要地创建一个几乎立即被放弃并符合垃圾回收条件的列表。

于 2012-05-14T03:14:20.743 回答