無論是指類型的變量或是類類型的變量,其存儲單元都是在棧中分配的,唯一不同的是類類型的變量實際上存儲的是該類對象的指針,相當於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