我写这个并不是我要教给谁,因为我怕误人子弟。。。我只是想堆自己的知识做一个总结并且希望能有人指出我的错误。
首先,要先讲讲clr,clr向windows系统申请一块空间,作为托管堆,clr在托管堆上运行.net程序。在托管堆中,gc垃圾回收器负责对托管堆的管理(创建销毁回收对象,整理托管堆,这方面内容下次讲)。当创建一个对象的时候,即 class1 c = new class1();这个语句其实是需要分三步的。 1 new class1(); 即调用class1的构造函数,初始化class1,这个动作在托管堆的表示为:托管堆按照在栈上的类为模版,在堆区创建一个类的对象,初始化其中的成员(调用构造函数,例如把值类型初始化为0,把引用性设置为null。。bool型我没有试过,大家可以写个测试程序试一试) 第二步,申明一个class1类型的变量,c,这个变量是生存在栈上的,并为四个字节的大小(大小由操作系统决定,如果为64位操作系统,则为8个字节)。第三步,把刚才在堆区上创建的对象的起始地址赋给c,即 c = new class1();最后就完成啦。
需要补充的一些东西是:所有的引用类型对象都是在堆区,而所有的值类型都是在栈区。方法体实际上是存活在栈区,但实例方法包含在对象中,对象里存储的是方法在栈区上的地址。堆是由clr管理,对象的生存周期由gc管理,而栈区的变量的存活时间是由其作用域决定的,出了作用域,变量生存期就到了。