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