首页 / 软件开发 / C# / 《Effective C#》:使用成员初始化语句
《Effective C#》:使用成员初始化语句2010-12-13 天极 愚翁为了方便内容的开展,我先说说一个对象的构造过程。对于类型第一 个实例的构造过程大致如下:1.分配静态成员的内存空间,此时空间存 储数据为0;2.执行静态成员的初始化语句;3.执行基类的静 态构造函数;4.执行类型的静态构造函数;5.分配成员的内存 空间,此时空间存储数据为0;6.执行成员的初始化语句;7. 执行相应的基类构造函数;8.执行类型的构造函数。那么对于 同类型的后续创建对象,前4个步骤不用执行的,直接从第5步开始。现 在来说说为什么推荐使用成员初始化语句来初始化成员。由于成员初始化先于构 造函数的调用,所以更早初始化有利于使用;其次,避免对构造函数重复添加初 始化代码,尤其是新增成员的时候,把初始化放到定义成员的位置,减少因构造 函数之间的不一致,而造成某些成员未被初始化。而且把成员初始化从构造函数 中抽出来,使代码显得更简洁明朗。例如:public class MyList
{
//Init class member here
private ArrayList _List = new ArrayList();
}
是不是所有的成 员都可以这样进行初始化呢。事实上,有三种场景是不适合用这样的方式来完成 成员初始化。第一种就是给成员赋给“0”或者 “null”,这并不是错误语句,而是没有必要的。参看前面的对象构 造过程,由于成员首先会被分配内存空间,并且同时已经用“0”进 行初始化了。因此显式的赋值会增加指令操作,而影响效率。第二种就 是根据不同参数来指明成员初始化的方式,而一般类似操作是放在构造函数中。如果使用成员初始化语句的话,那么在构造函数中重新初始化成员,就会生成一 个短暂的临时对象。例如:public class MyList
{
//Init class member here
private ArrayList _List = new ArrayList();
public MyList()
{}
public MyList( int nSize )
{
_List = new ArrayList( nSize );
}
}