构造函数中的new
和成员声明中的new
之间有什么区别?
实施例
public class PspGame {
private List<string>name = new List<string>();
private List<string>_value;
public PspGame() {
_value = new List<string>();
}
}
最好的方法是什么?有任何性能问题吗?
答案 0 :(得分:10)
它们非常相同(性能和内存使用方面的差异可以忽略不计)。唯一真正的区别在于:当你这样做时:
private List<string>name = new List<string>();
...无论使用什么构造函数创建对象的实例,都会发生赋值。在构造函数中执行赋值时,只有在使用该特定构造函数时才会发生。
因此,如果您有多个构造函数但总是希望以完全相同的方式初始化name
,则使用第一个表单比在每个构造函数中显式初始化它要短一些。
但是,作为一般规则,我更喜欢在构造函数实现中初始化字段,即使它确实在某些情况下使代码更加冗长。
答案 1 :(得分:4)
对于我来说,在构造函数(非默认构造函数)中有一个参数可以进行更好的测试。您可以将某些数据“注入”某个成员字段,如果不将该成员公开(或至少是内部成员)或使用“setter”属性进行第二次调用,您不一定能够这样做。
因为您可以拥有多个构造函数,所以如果您真的需要,可以使用第二个构造函数与默认构造函数一起进行测试。
除了必须单独调用以后再填充数据,或者具有对类的多次调用的可维护性较低的代码(一个用于创建对象,第二个用于填充成员)之外,没有任何实际的性能问题。
编辑:我意识到我回答了错误的问题。我以为他在询问默认和非默认构造函数之间的区别。现在我看到它是关于默认构造函数初始化构造函数中的成员而不是成员声明...
答案 2 :(得分:1)
这两个是等价的。编译器将任何此类成员的初始化移动到构造函数(如果成员是静态的,则为静态构造函数)。我不会说有一般的最佳方法 - 尽可能保持一致,如果在这种情况下更有意义,请使用它。
答案 3 :(得分:1)
在构造函数中初始化实例成员,初始化声明中的类成员。 AFAIK这是(仅)惯例,并且没有性能损失。恕我直言,这应该强制进入语言规则(语法/语义)。
答案 4 :(得分:1)
在构造函数中初始化字段还可以避免此问题:
class MyClass
{
private List<string> _list = new List<string>();
public MyClass()
{
//some logic here
}
public MyClass(List<string> initialList) : this()
{
_list = initialList;
}
}
使用这段代码,如果你调用第二个构造函数,你将不必要地创建一个几乎立即被放弃并且有资格进行垃圾收集的列表。