前言
在上一節(jié)中,我們講到在c#中所有的類都繼承一個基類--System.Object。然后其下又分為倆大類--值類型及引用類型。這一節(jié)我們詳細講解值類型和引用類型包含了那些東西及內(nèi)存的分配
堆和棧
在我們講解類型前,我們得先去了解堆和棧是什么,及其區(qū)別。我們可以先知道值類型和引用類型的引用都是分配在棧中的,而引用類型的對象分配在堆中的。我們詳細看看堆和棧有啥區(qū)別及其原理吧
堆(heap)
--堆的分配空間是自下到上的,已占用的空間在自由空間下面,C#中引用類型的對象及分配在堆中的,內(nèi)存的分配是連續(xù)的。內(nèi)存對象釋放是受垃圾回收機制管理的,所有在引用對象釋放時會消耗更多的性能。效率相對于棧來說是較低的。
棧(stack
)--棧的分配空間是自上到下的,遵循先進先出的原則,依次釋放分配的內(nèi)存空間。分配的內(nèi)存空間是連續(xù)的,C#中的值類型及引用類型的引用都是存放在棧中的。
當(dāng)一個類的實例創(chuàng)建對象的的時候,這個對象的不同的成員將被分配到不用的內(nèi)存空間,值類型及引用類型的引用分配到棧中,引用類型對象分配到堆中,靜態(tài)成員被分配到全局數(shù)據(jù)區(qū)。這個時候棧上的指針會指向堆中實際的對象,在對象使用完成后,指針和對象會切開聯(lián)系,從而使對象進入冬眠期,因為棧具有自我維護性,內(nèi)存管理通過操作系統(tǒng)完成,而堆中的冬眠對象將有垃圾回收機制進行回收,釋放對象所占的內(nèi)存。
值類型及引用類型
值類型:
結(jié)構(gòu)體:struct(直接派生于System.ValueType)
數(shù)值類型:整型、浮點型、decimal型、bool型
枚舉:enum(派生于System.Enum)
引用類型:
數(shù)組:Array(派生于System.Array)
類:class(派生于System.Object)
接口:interface
委托:delegate(派生于System.Delegate)
字符串:string(System.String)
在此特別強調(diào)
:.Net中所有的元素在使用前都必須初始化,在調(diào)用new創(chuàng)建實例的時候,編譯器會隱式的調(diào)用無參構(gòu)造函數(shù)進行初始化。所有的值類型的值都為0(char為’0’),所有引用類型為null。
在此可調(diào)用IsValueType來判斷類型是否為值類型
StringBuilder strSql = new?StringBuilder();
?if?(strSql.GetType().IsValueType)
????{
?
}
引用類型中尤為注意的事string類型,它具有一特效--恒定不變性,什么意思呢?也就是說string類型一旦賦值,一旦在Heap堆中分配了內(nèi)存存儲對象,則再也無法改變其對象的內(nèi)容
。我們看下面這個例子
String a=”aaa”;
a=”bbb”;
在這個例子中先是對象a創(chuàng)建在堆中分配內(nèi)存存儲’aaa’,然后又給a對象重新賦值’bbb’,其中并不是修改堆內(nèi)存中對象aaa為bbb,實則是重新創(chuàng)建了一個堆內(nèi)存對象存儲’bbb’,然后把它的引用地址指向a,原來的堆內(nèi)存對象’aaa’還繼續(xù)保存在堆內(nèi)存中,不曾修改。只有當(dāng)GC垃圾回收機制處理回收,才會消失。
總結(jié)
c#基礎(chǔ)知識詳解系列
<https://www.cnblogs.com/hulizhong/p/11205119.html>
歡迎大家掃描下方二維碼,和我一起學(xué)習(xí)更多的C#知識
熱門工具 換一換