C 值型別和引用型別的區別

2021-09-24 18:19:55 字數 1778 閱讀 9663

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 ...