系列二:资源管理(变量初始化,静态构造器,构造器链)

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步是可以被优化放置在构造器初始化器中,这样编译器便可以移除重复的指令。

 

 

 

posted @ 2011-01-05 22:47  yu_liantao  阅读(305)  评论(0编辑  收藏  举报