none
MDI 子表單的 Dispose RRS feed

  • 問題

  • Close 時不處置表單的兩項條件是 (1) 表單為多重文件介面 (MDI) 應用程式的一部分,且表單不可見,以及 (2) 您已使用 ShowDialog 顯示表單。" data-guid="092edae0-1298-17b3-697d-b2a2a44d6487" id="mt7">諸位先進大家好:

    Close 時不處置表單的兩項條件是 (1) 表單為多重文件介面 (MDI) 應用程式的一部分,且表單不可見,以及 (2) 您已使用 ShowDialog 顯示表單。" data-guid="092edae0-1298-17b3-697d-b2a2a44d6487" id="mt7">      在 MSDN 裡的 Form.Close 方法裡有這段話:

    Close 時不處置表單的兩項條件是 (1) 表單為多重文件介面 (MDI) 應用程式的一部分,且表單不可見,以及 (2) 您已使用 ShowDialog 顯示表單。" data-guid="092edae0-1298-17b3-697d-b2a2a44d6487" id="mt7">The two conditions when a form is not disposed on Close is when (1) it is part of a multiple-document interface (MDI) application, and the form is not visible; and (2) you have displayed the form using ShowDialog. Dispose,以便為記憶體回收標記表單的所有控制項。" data-guid="1e0c521d-fa35-5607-3771-1dcdce63849d" id="mt8">In these cases, you will need to call Dispose manually to mark all of the form's controls for garbage collection.

          他的意思是說 MDI 子表單在被關閉時 ( 按下 X or 呼叫 Close() ),表單的 Dispose() 不會自動被呼叫。

          那是不是我應該要在 MDI 子表單的 FormClosed 事件裡加上 this.Dispose() 呢?

    2014年3月20日 下午 05:09

解答

  • 只要還有參考指向該物件, 就不會被 GC 回收, 除非你呼叫 Dispose.

    但只要沒有參考指向那個物件了, GC 就會排定它自動釋放, 但時機不一定.

    只要主程式關了, 就甚麼都沒了.參考 Component.Dispose 方法


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


    2014年3月21日 上午 09:44
    版主

所有回覆

  • 您好,

    或許可以在主程式要關閉時,再統一呼叫(MdiChildren)子表單的Dispose!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年3月21日 上午 01:49
  • 你好,

          自行呼叫 Dispose 的目的,不就是要在程式結束或 GC 回收資源之前,

          自己讓資源被釋放嗎?

          如果主程式都要關閉了,那我應該就不再需要呼叫 Dispose 了吧?

          因為程式結束前 GC 應該會回收所有程式用到的資源,

          不知道我這樣的觀念對不對?

    2014年3月21日 上午 04:30
  • 您好,

    您可以想一下,當 「表單為多重文件介面 (MDI) 應用程式的一部分 And 表單不可見」時,

    什麼時候 Form去Call FormClosed事件呢?


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年3月21日 上午 04:39
  • 你好,

          呃,不是很懂你想表達的意思,如是說 MDI 子表單的 FormClosed 事件甚麼時候會被呼叫的話,
          按下 MDI 子表單的 X 按鈕就會呼叫 FormClosed,或是如果父表單有保留子表單的 Reference,
          那麼由父表單呼叫子表單.Close() 也會執行到仔表單的 FormClosed。

    2014年3月21日 上午 09:10
  • 只要還有參考指向該物件, 就不會被 GC 回收, 除非你呼叫 Dispose.

    但只要沒有參考指向那個物件了, GC 就會排定它自動釋放, 但時機不一定.

    只要主程式關了, 就甚麼都沒了.參考 Component.Dispose 方法


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


    2014年3月21日 上午 09:44
    版主
  • 您好,
    1.表單為多重文件介面 (MDI) 應用程式的一部分
    2.表單不可見
    所以這時候,MDI Child Form是看不見的哦!
    所以跟本沒有機會去按到它對吧!

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年3月21日 上午 10:04