2010-08-30 52 views

回答

35

調用Close內部調用Dispose,所以你並不需要同時調用。從.NET Reflector

public void Close() 
{ 
    if (s_LoggingEnabled) 
    { 
     Logging.Enter(Logging.Sockets, this, "Close", (string) null); 
    } 
    ((IDisposable)this).Dispose(); 
    if (s_LoggingEnabled) 
    { 
     Logging.Exit(Logging.Sockets, this, "Close", (string) null); 
    } 
} 

如果可能的話,你應該使用using模式,讓你總是調用Dispose無論任何可能發生的異常。

+2

thnx爲dasm,但這很奇怪。 MSDN說Close()是放棄異步操作(如BeginReceive())的一種很好且合法的方法,然後EndReceive將返回「對象處置」錯誤。任何想法應該如何工作? – 2011-01-11 20:38:15

+0

http://stackoverflow.com/questions/4662553/how-to-abort-sockets-beginreceive/4662631#4662631 – 2011-01-11 22:35:20

+0

你可以說關於IP不可達的問題嗎? @Mark Byers https://stackoverflow.com/questions/44694061/udpclient-unreachable-ip-connection-time-with-using-blocks – 2017-06-23 13:38:30

6

按照慣例,你應該總是調用Dispose任何實現IDisposable。除了顯而易見的事情之外,你永遠不知道它可能做了什麼。

如果你碰巧使用反射地看到,事實上,它目前是不需要的,你不應該假設內部實現可能在某一時刻發生變化。

它從來沒有傷害調用處置。只要做到這一點:)

+0

它不會傷害調用Dispose,但你不需要如果你'重新使用「使用」結構;它會自動完成。 「using」構造實際上編譯爲「try ... finally」,Dispose在「finally」中調用。 – Andy 2010-08-30 15:06:44

+3

你是對的。我沒有拼出來,但「使用結構」=調用Dispose。只要Dispose被調用。在列出的具體情況中,通常很難將「使用構造」與套接字一起使用,因爲它們不是在單個方法調用中構造,使用和處理的。套接字通常比單一方法壽命更長,因此必須直接調用Dispose。 – 2010-08-30 16:17:51

19

關閉和處置在這種情況下是相同的。當Ms在.Net 1中引入Dispose模式時,Dispose字不易被發現。因此,準則是添加特定於上下文的關鍵字,這些關鍵字將執行相同的功能,並且更容易被用戶發現。像關閉文件和套接字一樣。

+3

+ 1酷歷史課:)。 – Kevin 2010-08-30 15:07:18

+0

相關的MSDN博客文章: [Close和Dispose之間的區別](https://blogs.msdn.microsoft.com/kimhamil/2008/03/15/the-often-non-difference-between-close-and-配置/)。 – Paul 2017-04-19 20:23:19

2

它通常被視爲許多最佳實踐關閉IDisposable的對象,因爲它使代碼更清晰。但是,如果您在使用語句中封裝了IDisposable的用法,則顯式調用Dispose會自動完成,如this page所述。

0

讓.NET調用配置:

using (Socket mySocket = new Socket(...)) { 
    // Do stuff with socket, then bring it down nicely 
} // Dispose gets called returning the unmanaged system resources 
+1

問題不在於使用什麼,而在於調用.Close()後調用.Dispose()(不管是否顯式調用Dispose)。 – 2014-02-13 22:58:53

0

你是對的。文檔不清楚,因爲在dispose方法中,應該調用Dispose()來清理套接字非託管資源,但另一方面,Close應該也這樣做。我想那個關閉呼叫處置或相反。文件支持同樣的行爲,所以這是一個有教養的猜測。

+0

對於某些類型的對象,'Close'可能會保留一些資源,以允許重新打開對象;對於其他類型,「Close」沒有理由保留任何資源。無論哪種情況,由於在「關閉」之後調用'IDisposable.Dispose'應該沒有什麼壞處,這樣做將確保與兩種對象的兼容性。 – supercat 2014-02-10 16:37:03