直白點兒說:值型別就是現金,要用直接用;引用型別是存摺,要用還得先去銀行取現。 ——麥機長
我覺得這話十分形象。
宣告乙個值型別變數,編譯器會在棧上分配乙個空間,這個空間對應著該值型別變數,空間裡儲存的就是該變數的值。引用型別的例項分配在堆上,新建乙個引用型別例項,得到的變數值對應的是該例項的記憶體分配位址,這就像銀行賬號一樣。
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型,使用者定義的結構體),列舉,可空型別。1.c#的所有值型別均隱式派生自system.valuetype。c#的引用型別包括:陣列,使用者定義的類、介面、委託,object,字串。
陣列的元素,不管是引用型別還是值型別,都儲存在託管堆上。
各個值型別及其基類:
結構體:
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不是同乙個記憶體。引數變數,分配在棧上。函式返回...