堆和棧的區(qū)別?
- 棧是編譯期間就分配好的內(nèi)存空間,因此你的代碼中必須就棧的大小有明確的定義。
- 局部值類型變量、值類型參數(shù)等都在棧內(nèi)存中。
- 堆是程序運(yùn)行期間動態(tài)分配的內(nèi)存空間,你可以根據(jù)程序的運(yùn)行情況確定要分配的堆內(nèi)存的大小。
不是說字符串是不可變的嗎?string s="abc";s="123"; 不就是變了嗎?
String是引用類型,變量中存放的是指針,即指向數(shù)據(jù)的地址。改變String類型變量中的內(nèi)容,實(shí)際上是在堆內(nèi)存中放入了一個新的字符串,并把這個字符串的地址賦值給了變量。- 在這段代碼中,s原先指向一個
String對象,內(nèi)容是"abc",然后我們將s指向"123"。- 這時的s不指向原來那個
"abc"的String對象了,而指向了另一個內(nèi)容為"123"的String對象,原來那個對象還存在于內(nèi)存之中,只是s這個變量不再指向它了。
你對.net 的 GC 的理解。
- GC是.Net 的垃圾收集器,可以進(jìn)行內(nèi)存資源的回收。
- 程序員無需關(guān)心資源的回收,當(dāng)一個對象沒有任何引用的時候就可以被回收了。
- 一個對象可以被回收并不意味著一定會被立即回收,GC會選擇時機(jī)進(jìn)行回收。
- 可以調(diào)用
GC.Collect()讓GC立即回收。- GC 不能回收非托管資源,對于非托管資源一般都實(shí)現(xiàn)了
IDisposable接口,然后使用using關(guān)鍵字進(jìn)行資源> - 的回收。