C#中的堆棧,值類型與引用類型
內(nèi)存分配
內(nèi)存用來存儲正在執(zhí)行的程序,分為兩個區(qū)域
棧區(qū):占地小,方便找,讀取速度較快
堆區(qū):占地大,讀取速度較慢(比硬盤快)
?
值類型與引用類型
?
因為方法執(zhí)行于棧中,所以方法聲明的變量都在棧中(僅僅存在于局部變量中,與成員變量的聲明和存儲不同),但由于值類型直接存數(shù)據(jù),引用類型直接存引用(不管是局部變量還是成員變量都通用),所以兩者應(yīng)用方法會有差別
有以下是方法內(nèi)值類型與引用類型存儲方式不同的影響:
?

程序執(zhí)行上圖代碼時的結(jié)果如下
?

修改一下再問

修改了堆
程序執(zhí)行上圖代碼時的結(jié)果如下
?



?
<修改了棧>這張截圖中最后一行代碼后,因為修改后i01創(chuàng)建了一個新的”引用”(引用02),在堆中開辟了與i02沒有關(guān)系的新地方,所以i02的”引用”(引用01)和堆中的值將不會改變
?
按照上面的說法,同為引用類型的s01給s02賦值”a”后再把堆中的數(shù)據(jù)改成”b”,s02應(yīng)該也隨著堆中的修改變成”b”
?

可運行后發(fā)現(xiàn)上圖的結(jié)果卻沒有任何改變,就像圖1-7只改變了s01,因為s01=”b”實際上修改的是棧,創(chuàng)建了一個新引用,和new數(shù)組是一個原理
?
判斷代碼是修改堆還是修改棧的小技巧:看修改的變量右邊有沒有加中括號,加了就是修改堆,沒加就是修改棧
標簽: