c#中 變數型別分兩種:值型別和引用型別
由此引發兩種形式的記憶體空間:堆疊和託管堆
堆疊(又稱棧)
:存放所有值型別的資料
託管堆:存放所有引用型別的資料
值型別的變數本身就存放資料
而引用型別則儲存實際資料的引用
值型別有個特點,那就是大小都固定,比如乙個位元組的byte、4個位元組的int。即使資料變了,佔的儲存空間也不會變,這裡的整形i直接對應著他的資料的儲存空間,這個儲存空間就是棧。
而stu直接對應到儲存stu資料的位址或引用,其實這個位址本身是大小固定的,也儲存在棧上,而stu物件的具體資料都儲存在堆上,如果需要獲取stu物件的資料,自然可以按照儲存資料的位址找到資料,這好比根據別墅的位址找到別墅一樣。
。net程式首先被編譯成il程式,然後再託管執行。
值型別直接從堆疊(又稱棧)裡取值就可以
引用型別必須要先從堆疊裡邊取出他的位址,再根據這個位址到堆裡邊找到對應的值。
值型別
c#的所有值型別均隱式派生自system.valuetype:
分類
說明
範圍
整數型別
sbyte 8位
-128~127 【-2
8-1 ~
(28-1
+1)】
short
16位同上邊計算方法一樣
int32位
long
64位byte
8位(無符號,即無負數)
0~255
ushort
16位(無符號,即無負數)
0~65535
uint
32位(無符號,即無負數)
ulong
64位(無符號,即無負數)
浮點型別
float
精確到7位數
float num=9.24f;
double
精確到15~16位數
沒特指型別就預設為double型別
布林型別
true
false
列舉
enum(派生於system.enum);
引用型別 分類
說明 陣列
派生於system.array
使用者自定義的型別
類 class
派生於system.object
介面 inte***ce
介面不是乙個「東西」,所以不存在派生於何處的問題
委託 delegate
派生於system.delegate o
bject
system.object的別名
字串system.string的別名
可以看出:
c 引用型別和值型別區別
解析 clr支援兩種型別 值型別和引用型別。用jeffrey richter clr via c 作者 的話來說,不理解引用型別和值型別區別的程式設計師將會把 引入詭異的陷阱和諸多效能問題 這就要求我們正確理解和使用值型別和引用型別。值型別包括c 的基本型別 用關鍵字int char float等來...
C 引用型別和值型別的區別
我們都知道,c 的兩大資料型別分別為值型別和引用型別。很多人或許閉著眼睛都能說出值型別包括簡單型別 結構體型別和列舉型別,引用型別包括自定義類 陣列 介面 委託等,但是當被問及到二者之間的聯絡和區別,什麼時候用struct什麼時候用class時,就常常混淆不清了。為此,了解值型別和引用型別的本質差異...
值型別和引用型別區別
3.1.3 值型別和引用型別的區別 37 值型別和引用型別的基本概念 值型別和引用型別的記憶體分配 值型別的基類 分析問題 所有.net 的型別都可以分為兩類 值型別和引用型別。最簡單也最明確的乙個區分標準是 所有的值型別都繼承自 system.valuetype system.valuetype ...