none
C#的垃圾回收機制問題? RRS feed

  • 問題

  • 各位好:

    假設我宣告了一新物件PictureBox。使用完畢後,將其設為NULL,便會啟動垃圾回收機制,回收其所使用的記憶體。這跟呼叫物件的Dispose()方法有差別嗎?

    pictureBox = NULL;

    pictureBox.Dispose();

    兩種方式有差異嗎?

     

                                                            2011.10.14           chouyuanming

    2011年10月14日 上午 12:23

所有回覆

  • GC時應該會Call物件的Dispose!
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/
    2011年10月14日 上午 12:46
  • 以下說明如有錯誤,請各位前輩多指教

     

    null -> 可釋放物件 -> 依照 GC 演算法等待回收

    dispose -> 明確指定可被釋放 -> GC 第一次執行就會釋放掉

     


    歡迎參觀我的Blog.NET菜鳥自救會
    • 已提議為解答 阿尼 2011年10月14日 上午 01:20
    2011年10月14日 上午 12:53
    版主
  • null是減少參照,所以有其它變數還參照著的話仍然不會回收,只會移到下一個Generation。

    2011年10月14日 上午 01:22
  • 所以,寫了null之後,就可以不必寫Dispose()?或者寫了Dispose之後,就可省略null?
    2011年10月14日 上午 03:54
  • 基本上應該是這麼講, 請把變數和執行個體分開看待

    假設你 Class1 c =new Class1();

    這樣看成兩個東西喔, 一個是c這個變數, 一個是依Class1類別產生的執行個體.

    所以如果你加一行 a=c;

    這表示有兩個變數, a和c, 但執行個體還是只有一個..

    以執行個體的觀點來看, 當沒有任何變數參照它的時候, GC 才會回收.

    意即以上面的例子, 必須 a=null 且 c=null, GC才會回收掉 "執行個體"

    第一個你要知道的觀念是 "在參考型別中, 變數並不完全等於執行個體, 參考型別變數的內容存放的其實是指向執行個體的參考"

    所以Dispose 和 null 基本上是不一樣的.

    Dispose是該變數所指向執行個體的Dispose方法, 而你將變數設成null, 只是改變該變數本身.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2011年10月14日 上午 04:14
    版主
  • 所以,寫了null之後,就可以不必寫Dispose()?或者寫了Dispose之後,就可省略null?


    你用了 null 就不能再用 Dispose ... 你應該反過來吧...

    不然你馬上得到 null 參照。

    物件變數本身是指標,物件實體在遠程。所以遠程實體消滅了,指標未必消滅。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年10月14日 下午 01:08