c#資料型別分隔為值型別和引用型別。而所用資料型別都繼承自
object。
1.值型別繼承自system.valuetype,引用型別繼承自system.object。valuetype也直接繼承自object。如圖:
每種值型別均有乙個隱式的預設建構函式來初始化該型別的預設值,注意所有的值型別都是密封(sealed)的,所以無法派生出新的值型別。而且system.valuetype 本身是乙個類型別,而不是值型別,
因為它重寫了 object.equals(object),所以對值型別將按照例項的值來比較,而不是 比較引用位址。
值型別直接儲存其值,變數本身就包含了其實例資料,而引用型別儲存的只是例項資料的記憶體引用。 因此,乙個值型別變數就永遠不會影響到其他的值型別變數,而兩個引用型別變數則很有可能指向同一位址,從而發生相互影響。
2.
注:棧是作業系統分配的乙個連續的記憶體區域,用於快速訪問資料。因為值型別的容量是已知的,因此它 可儲存在棧上。而託管堆是 clr 在應用程式啟動時為應用程式預留的一塊連續記憶體區,是用於動態記憶體分 配的記憶體區,引用型別的容量只有到執行時才能確定,所以用堆來儲存引用型別。 棧的記憶體分配是自動釋放;而堆在.net中會有gc來釋放 。
3.相互轉換(裝箱/拆箱).
c# 的通用型別系統(common type system),使得值型別可以轉化為
物件來處理,這就是常說的裝箱和拆箱。由於裝拆箱需要裝建全新物件或做強制型別轉換,這些操作所需時間和運算要遠遠大於賦值操作,因此不提倡 使用它,同時也要盡量避免隱式裝拆箱的發生。如前面所述,值型別要麼是堆疊分配的,要麼是在結構中以內聯方式分配的。引用型別是堆分配的。
當值型別需要充當物件時,cts就在
堆上分配乙個包裝(該包裝能使值型別看上去像引用物件一樣),並且將該值型別的值複製給它。該包裝被加上標記,以便系統知道它包含乙個值型別。這個程序稱為裝箱,其反向程序稱為取消裝箱。裝箱和取消裝箱能夠使任何型別像物件一樣進行處理。
C 的資料型別 值型別和引用型別
c 的資料型別包含兩大類 值型別和址型別 引用型別 值型別 只是用來存放資料的型別。值型別包括 簡單型別 純量型別 結構型別 struct 列舉型別 enum 簡單型別包括 整數型別 布林型別 實數型別 字元型別 char 整數型別 sbyte byte short ushort int uint ...
資料型別的值型別和引用型別
參考 c 詳解值型別和引用型別區別 值型別 簡單型別 有符號整型 sbyte short int long 無符號整型 byte ushort uint ulong unicode 字元 char,表示 utf 16 單元 ieee 二進位制浮點 float double 高精度十進位制浮點數 de...
C 之值型別和引用型別
值型別與引用型別是很基礎的知識,也有很多對此的介紹,如果想深入了解,張老師的部落格講解的很好,鏈結如下 我在這裡只是淺淺的介紹一下下 從概念上看,值型別直接儲存其值,而引用型別儲存對其值的引用。我們知道,c 中的每一種型別要麼是值型別,要麼是引用型別。所以每個物件要麼是值型別的例項,要麼是引用型別的...