2011-09-24 49 views
5

當我使用Show()使用Dispose()而不是Close()關閉表單時發生了什麼?有人可以詳細告訴我,Dispose()方法中發生了什麼?使用dispose()方法代替close()方法到表格

+0

C#沒有窗體。請指定WinForms/WPF/... –

+0

@亨克霍爾特曼 - 我已更新我的問題 – Selo

+0

[我需要在窗體關閉後處理窗體嗎?](https://stackoverflow.com/a/39501121/3110834 ) –

回答

6

Close()Dispose()之間的基本區別是,當調用Close()方法時,任何託管資源都可以暫時關閉,並可以再次打開。這意味着,使用相同的對象可以重新打開或使用資源。作爲Dispose()方法從內存中永久刪除任何資源((未)管理)進行清理,並且該資源不再存在以用於任何進一步處理。


或者只是一般的說法。連接對象調用Close()將釋放連接回池中。調用Dispose()將調用Close(),然後將連接字符串設置爲空。

某些對象(如Stream)實現了IDisposable,但Dispose方法僅在首先將該對象投射到IDisposable時可用。但它確實公開了Close()方法。

我總是會爭辯說,當對象完成時,你應該調用Dispose()任何執行IDisposable的對象。即使它什麼都不做。無論如何,jit編譯器會優化它的最終代碼。如果對象包含Close()但不包含Dispose(),則請致電Close()

您也可以使用IDispoable對象

using(SqlConnection con = new SqlConnection()) 
{ 
    //code... 
} 

這using語句將調用Dispose()上的SqlConnection時,會退出塊。

3

反編譯的兩個方法(DisposeClose)事實證明,後者執行兩個額外的檢查,然後調用Dispose,就像這樣的:

object[] objArray; 
if (base.GetState(262144)) 
{ 
    throw new InvalidOperationException(SR.GetString("ClosingWhileCreatingHandle", new object[] { "Close" })); 
} 
if (base.IsHandleCreated) 
{ 
    this.closeReason = CloseReason.UserClosing; 
    base.SendMessage(16, 0, 0); 
    return; 
} 
base.Dispose(); 

從文檔:

當表單已關閉,則在該對象內創建的所有資源都將關閉並處理該表單。 表單在關閉時不處理的兩個條件是:(1)它是多文檔界面(MDI)應用程序的一部分,且表單不可見;和(2)你使用ShowDialog顯示了表單。在這些情況下,您需要手動調用Dispose來標記垃圾收集的所有表單控件。

希望它有幫助。

1

其實,在這種情況下Close()Dispose()是完全不同的:

Close通過發送此時,相應的Windows消息關閉窗體。您將可以使用Open()

Dispose完全配置表單資源,並且您將無法再重新使用表單實例。