堆和棧的區(qū)別凯旭?
- 棧是編譯期間就分配好的內(nèi)存空間属提,因此你的代碼中必須就棧的大小有明確的定義。
- 局部值類型變量病往、值類型參數(shù)等都在棧內(nèi)存中捣染。
- 堆是程序運行期間動態(tài)分配的內(nèi)存空間,你可以根據(jù)程序的運行情況確定要分配的堆內(nèi)存的大小停巷。
不是說字符串是不可變的嗎耍攘?string s="abc";s="123"; 不就是變了嗎?
String
是引用類型畔勤,變量中存放的是指針蕾各,即指向數(shù)據(jù)的地址。改變String
類型變量中的內(nèi)容庆揪,實際上是在堆內(nèi)存中放入了一個新的字符串式曲,并把這個字符串的地址賦值給了變量。- 在這段代碼中缸榛,s原先指向一個
String
對象吝羞,內(nèi)容是"abc"
,然后我們將s指向"123"
内颗。- 這時的s不指向原來那個
"abc"
的String
對象了钧排,而指向了另一個內(nèi)容為"123"的String
對象,原來那個對象還存在于內(nèi)存之中均澳,只是s這個變量不再指向它了恨溜。
你對.net 的 GC 的理解符衔。
- GC是.Net 的垃圾收集器,可以進行內(nèi)存資源的回收糟袁。
- 程序員無需關(guān)心資源的回收判族,當(dāng)一個對象沒有任何引用的時候就可以被回收了。
- 一個對象可以被回收并不意味著一定會被立即回收系吭,GC會選擇時機進行回收五嫂。
- 可以調(diào)用
GC.Collect()
讓GC立即回收。- GC 不能回收非托管資源肯尺,對于非托管資源一般都實現(xiàn)了
IDisposable
接口沃缘,然后使用using
關(guān)鍵字進行資源> - 的回收。