值型別與引用型別

2021-07-04 05:39:52 字數 2365 閱讀 4442

直白點兒說:值型別就是現金,要用直接用;引用型別是存摺,要用還得先去銀行取現。    ——麥機長

我覺得這話十分形象。

宣告乙個值型別變數,編譯器會在棧上分配乙個空間,這個空間對應著該值型別變數,空間裡儲存的就是該變數的值。引用型別的例項分配在堆上,新建乙個引用型別例項,得到的變數值對應的是該例項的記憶體分配位址,這就像銀行賬號一樣。

1: public class person

2: 4: public int age

5: }

6:

7: public static class referenceandvalue

8: ;

12: person anders = new person ;

13:

14: int age = zerocool.age;

15: zerocool.age = 22;

16:

17: person guru = anders;

18: anders.name = "anders hejlsberg";

19:

20: console.writeline("zerocool's age:\t", zerocool.age);

21: console.writeline("age's value:\t", age);

22: console.writeline("anders' name:\t", anders.name);

23: console.writeline("guru' name:\t", guru.name);

24: }

25: }

zerocool和anders這兩個物件都被分配在堆上,而zerocool和anders本身其實只是物件所在記憶體區域的起始位址引用,換句話說就是指向這裡的指標。而age是值型別,編譯器在棧上給他分配了一塊空間,這裡的賦值給age,則是將zerocool的age值放到了那個空間中。而guru是引用型別,他所對應的賦值,則是將anders的堆上的資料位址引用賦值給了guru,則guru和anders指向了同乙個地方。

c#的值型別包括:結構體(數值型別,bool型,使用者定義的結構體),列舉,可空型別。

c#的引用型別包括:陣列,使用者定義的類、介面、委託,object,字串。

陣列的元素,不管是引用型別還是值型別,都儲存在託管堆上。

1.c#的所有值型別均隱式派生自system.valuetype。

各個值型別及其基類:

結構體:

struct(直接派生於system.valuetype);

數值型別:

整型:short(system.int16),

ushort(system.uint16),

int(system.int32),

uint(system.uint32)

,long(system.int64),

ulong(system.uint64),

sbyte(system.sbyte的別名),byte(system.byte),

字元型:

char(system.char);

浮點型:

float(system.single),double(system.double);

用於財務計算的高精度decimal型:decimal(system.decimal)。

bool

型:bool(system.boolean的別名);

列舉:enum(派生於system.enum);

可空型別(派生於system.nullable泛型結構體,語法 t? 是 system.nullable的簡寫,此處的 t 為值型別。)

2.c#的所有引用型別均隱式派生自system.object。

各個引用型別及其基類:

陣列:(派生於

system.array

)陣列的元素,不管是引用型別還是值型別,都儲存在託管堆上;類:

class

(派生於

system.object

);介面:

inte***ce

(介面不是乙個「東西」,所以不存在派生於何處的問題。

);委託:

delegate

(派生於

system.delegate

);object

:(system.object

的別名);

字串:

string

(system.string

的別名)。

值型別與引用型別

工作許久了,可是對c 中的值型別和引用型別卻一直無法很好的理解。這兩天花了不少時間查詢資料,看文章,終於有所收穫,在此將自己理解整理出來,方便日後自己檢視,同時希望對跟我有一樣困惑的朋友有所幫助。廢話不多說,下面開始說說怎麼理解值型別和引用型別!值型別資料直接在他自身分配到的記憶體中儲存資料,而引用...

值型別與引用型別

自動變數型別是指儲存於該程式 程序 堆疊空間的一種變數型別 注意此時的堆疊空間並不是組合語言上的堆疊,只是它的使用及釋放類似於堆疊的過程 這個變數型別的乙個特點是它在程式執行時存在,在程式結束時消失。正是這個過程類似於彙編裡棧的操作,所以才將其命名 處理 為堆疊。我們平時所定義的int之類的型別都屬...

值型別與引用型別

引用型別 結構體byte,short,int,long,float,double,decimal,char,bool,enum和struct 統稱為值型別。函式返回以後,釋放記憶體 class person void test1 int a 與上方的a不是同乙個記憶體。引數變數,分配在棧上。函式返回...