2010-06-22 43 views
53

我是C#的新手,我試圖查看較早的帖子,但沒有找到一個好的答案。C#Form.Close vs Form.Dispose

在具有單個窗體的C#Windows窗體應用程序中,使用的是Form.Close()更好,還是Form.Dispose()

MSDN說,當關閉被調用時,對象內的所有資源都關閉並且表單被處理。儘管如此,我在網上遇到了一些遵循Dispose而不是Close的例子。

一個人比另一個人有優勢嗎?在哪種情況下,我們應該比另一種更適合?

+0

稍有不同的問題,同樣的答案,IMO:即關閉和處置通常是等價的,不過你可以調用Close超過一次。 – ChrisW 2010-06-22 21:53:39

+2

@Chrisw:您也可以多次調用Dispose。 – 2010-06-22 22:09:40

+0

@ChrisW,Dispose應該設計成運行多次。 http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae – 2010-06-22 22:10:05

回答

117

This MSDN論壇告訴你。

Form.Close()發送正確的Windows 消息關停的win32 窗口。在此過程中,如果 表單未以模態方式顯示,則Dispose將在表單上調用 。處理形式 釋放形式持有的非託管資源。

如果你做一個form1.Show()Application.Run(new Form1()),處置時Close()被稱爲 將被調用。

但是,如果你這樣做form1.ShowDialog() 展現形式模態,形式 不會設置,而您需要 叫form1.Dispose()自己。 I 相信這是您自己唯一需要處置 的時間 。

+0

這是爲什麼這樣下來投票? – 2010-06-22 21:52:34

+0

第一個版本是否包含報價? +1來補償。 – 2010-06-22 21:54:58

+0

@丹第一個版本吸...(對不起@Kyra) – jjnguy 2010-06-22 22:02:31

5

不調用Close可能繞過發送一串哪一個會想到的,雖然我不能具體告訴你爲什麼有些重要的Win32消息...

Close具有提高活動的好處(可以被取消),使得外部人員(對於表格)可以觀察FormClosingFormClosed以相應地作出反應。

我不清楚FormClosing和/或FormClosed如果你只是處理表單,但我會留下給你試驗。

+2

如果您處理表單,則不會調用關閉和關閉的事件。 – matrix 2011-01-19 08:48:56

+4

調用Dispose方法會導致窗口在Modal-Form上通過mdi-child窗口使用時閃爍 – dotNETbeginner 2011-10-23 20:10:15

12

作爲一般規則,我總是主張通過直接調用方法或包裝在「使用」塊中,明確地調用任何提供它的類的Dispose方法。

實現IDisposible的類經常會這樣做,因爲它們會包裝一些需要釋放的非託管資源。雖然這些類應該有終結器作爲安全措施,但調用Dispose將有助於儘早釋放內存並降低開銷。

在Form對象的情況下,正如Kyra指出的那樣,將Close方法記錄爲以您的名義調用Dispose,因此您不需要明確地這樣做。然而,對我而言,這總是感覺像依靠實現細節。我更喜歡總是爲實現它們的類調用Close和Dispose,以防止實現更改/錯誤,並且爲了清楚起見。正確實施的Dispose方法應該可以安全地調用多次。

0

使用using是一個不錯的辦法:

using (MyForm foo = new MyForm()) 
{ 
    if (foo.ShowDialog() == DialogResult.OK) 
    { 
     // your code 
    } 
} 
+0

'using'語句只是調用Dispose,這是一種很好的做法,但我認爲它不回答OP的問題。 – 2018-02-28 17:33:51