2010-08-30 44 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