在上一節中,咱們講到在c#中全部的類都繼承一個基類--System.Object。而後其下又分爲倆大類--值類型及引用類型。這一節咱們詳細講解值類型和引用類型包含了那些東西及內存的分配html
在咱們講解類型前,咱們得先去了解堆和棧是什麼,及其區別。咱們能夠先知道值類型和引用類型的引用都是分配在棧中的,而引用類型的對象分配在堆中的。咱們詳細看看堆和棧有啥區別及其原理吧c#
堆(heap)--堆的分配空間是自下到上的,已佔用的空間在自由空間下面,C#中引用類型的對象及分配在堆中的,內存的分配是連續的。內存對象釋放是受垃圾回收機制管理的,全部在引用對象釋放時會消耗更多的性能。效率相對於棧來講是較低的。數組
棧(stack)--棧的分配空間是自上到下的,遵循先進先出的原則,依次釋放分配的內存空間。分配的內存空間是連續的,C#中的值類型及引用類型的引用都是存放在棧中的。函數
當一個類的實例建立對象的的時候,這個對象的不一樣的成員將被分配到不用的內存空間,值類型及引用類型的引用分配到棧中,引用類型對象分配到堆中,靜態成員被分配到全局數據區。這個時候棧上的指針會指向堆中實際的對象,在對象使用完成後,指針和對象會切開聯繫,從而使對象進入冬眠期,由於棧具備自我維護性,內存管理經過操做系統完成,而堆中的冬眠對象將有垃圾回收機制進行回收,釋放對象所佔的內存。性能
值類型:學習
結構體:struct(直接派生於System.ValueType)ui
數值類型:整型、浮點型、decimal型、bool型spa
枚舉:enum(派生於System.Enum)操作系統
引用類型:指針
數組:Array(派生於System.Array)
類:class(派生於System.Object)
接口:interface
委託:delegate(派生於System.Delegate)
字符串:string(System.String)
在此特別強調:.Net中全部的元素在使用前都必須初始化,在調用new建立實例的時候,編譯器會隱式的調用無參構造函數進行初始化。全部的值類型的值都爲0(char爲’0’),全部引用類型爲null。
在此可調用IsValueType來判斷類型是否爲值類型
StringBuilder strSql = new StringBuilder();
if (strSql.GetType().IsValueType)
{
}
引用類型中尤其注意的事string類型,它具備一特效--恆定不變性,什麼意思呢?也就是說string類型一旦賦值,一旦在Heap堆中分配了內存存儲對象,則再也沒法改變其對象的內容。咱們看下面這個例子
String a=」aaa」;
a=」bbb」;
在這個例子中先是對象a建立在堆中分配內存存儲’aaa’,而後又給a對象從新賦值’bbb’,其中並非修改堆內存中對象aaa爲bbb,實則是從新建立了一個堆內存對象存儲’bbb’,而後把它的引用地址指向a,原來的堆內存對象’aaa’還繼續保存在堆內存中,未曾修改。只有當GC垃圾回收機制處理回收,纔會消失。
歡迎你們掃描下方二維碼,和我一塊兒學習更多的C#知識