系列二:资源管理(变量初始化,静态构造器,构造器链)
1.初始化器(在声明字段的时候就直接初始化,而不是在构造函数中处理)
初始化生成的代码会放置在类型的构造函数之前。初始化会在执行类型的基类的构造函数之前被执行,并且它们是按你声明的先后关系顺序执行的。
2.什么情况下不应该初始化变量
首先就是,如果你是初始化一个对象为0,或者为null。系统默认会在你任何代码执行前,为所有的内容都初始化为0。系统置0的初始化是基于底层的CPU指令,对整个内存块设置。你的任何其它置0的初始化语句是多余的。C#编译器忠实的添加额外的指令把内存设置为0(多余的设置)。这并没有错,只是效率不高(牵涉装箱和拆箱)。事实上,如果是处理值类型数据,这是很不值的。
第二个低效率的是在你为一个对象添加两个构造函数时会产生。你使用初始化器初始化变量,而所有的构造函数也对这些变量进行了初始化。
public class MyClass
{
private ArrayList _coll = new ArrayList( );
MyClass( )
{
}
MyClass( int size )
{
_coll = new ArrayList( size );
}
}
上面的代码将会被编译器编译成下面的代码
public class MyClass
{
private ArrayList _coll;
MyClass( )
{
_coll = new ArrayList( );
}
MyClass( int size )
{
_coll = new ArrayList( );
_coll = new ArrayList( size );
}
}
当你创建一个新的MyClass对象时,特别指定集合的大小,实际上你创建了两个ArrayList数组列表。其中一个很快成为垃圾对象。初始化器在所有的构造函数之前会执行,这样它创建了一个ArrayList,之后构造函数会创建第2个ArrayList数组列表。
3.你应该知道,在一个类型的任何实例初始化以前,你应该初始化它的静态成员变量。在里C#你可以使用静态的初始化器和静态构造函数来实现这个目的。一个类的静态构造函数是一个与众不同的,它在所有的方法,变量或者属性访问前被执行。你可以用这个函数来初始化静态成员变量,强制使用单件模式,或者实现其它任何在类型的实例可用前应该完成的工作。
同样,和实例的初始化器一样,静态的初始化器在静态的构造函数调用前执行。并且,你的静态初始化器在基类的静态构造函数执行前被执行。
4.构造第一个实例对象的操作顺序
1、将所有的静态变量设置我0。
2、执行静态变量初始化器。
3、执行基类的静态构造函数。
4、执行当前类型的静态构造函数。
5、将所有的实例变量设置为0。
6、执行实例变量初始化器。
7、执行适当的基类实例构造函数。
8、执行当前类型的实例构造函数。
后续的同样类型的实例从第5步开始,因为类的初始化器只执行一次。另外,第6和第7步是可以被优化放置在构造器初始化器中,这样编译器便可以移除重复的指令。