c#中的对象生命周期

无论是值类型的变量或是类类型的变量,其存储单元都是在栈中分配的,唯一不同的是类类型的变量实际上存储的是该类对象的指针,相当于vc6中的CType*,只是在.net平台的语言中将指针的概念屏蔽掉了。我们都知道栈的一大特点就是LIFO(后进先出),这恰好与作用域的特点相对应(在作用域的嵌套层次中,越深层次的作用域,其变量的优先级越高)。因此,再出了“}”后,无论是值类型还是类类型的变量(对象指针)都会被立即释放(值得注意的是:该指针所指向的托管堆中的对象并未被释放,正等待GC的回收)。.NET中的栈空间是不归GC管理的,GC仅管理托管堆。   
         我想就我的理解简要说明一下:   
          1、GC只收集托管堆中的对象。   
          2、所有值类型的变量都在栈中分配,超出作用域后立即释放栈空间,这一点与VC6完全   
                一样。   
          3、区别类类型的变量和类的对象,这是两个不同的概念。类类型的变量实际上是该类对   
                象的指针变量。如C#中的定义CType   myType;与VC6中的定义CType*   myType;是完全一   
                样的,只是.net语言将*号隐藏了。与VC6相同,必须用new   关键字来构造一个对象,   
                如(C#):CType   myType=new   CType();其实这一条语句有两次内存分配,一次是为类类   
                型变量myType在栈中分配空间(指针类型所占的空间,对32位系统分配32位,64位   
                系统则分配64位,在同一个系统中,所有指针类型所占的内存空间都是一样的,而   
                不管该类型的指针所指向的是何种类型的对象),另一次是在托管堆(GC所管理的   
                堆)中构造一个CType类型的对象并将该对象的起始地址赋给变量myType。正因为如   
                此才造成了在同一个作用域中声明的类类型的变量和该类型的对象的生存期不一样。   

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/AmelieMa/archive/2009/09/10/4538805.aspx

原文地址:https://www.cnblogs.com/linybo/p/13298598.html