关闭后,我仍然可以在我的套接字上拨打Dispose()
吗?
例如:
mySocket.Shutdown(SocketShutdown.Both);
mySocket.Close();
mySocket.Dispose(); // Redundant?
我很想知道因为the MSDN documentation说了以下内容:
关闭Socket连接并释放所有相关资源。
答案 0 :(得分:38)
在内部调用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,而不管可能发生的任何异常。
答案 1 :(得分:21)
关闭和处理是相同的。当Ms在.Net 1中引入Dispose模式时,Dispose字不是很容易被发现。因此,指南是添加特定于上下文的关键字,这些关键字将执行相同的功能,并且将更容易被用户发现。像关闭文件和套接字一样。
答案 2 :(得分:6)
按照惯例,您应该始终在实现IDisposable的任何内容上调用Dispose。除了显而易见的事情,你永远都不知道它可能会做些什么。
如果您碰巧使用Reflector看到它,实际上,目前不需要它,您不应该假设内部实现可能会在某些时候发生变化。
调用Dispose永远不会伤害。就这样做:)
答案 3 :(得分:2)
许多人通常认为关闭IDisposable对象是最佳做法,因为它使代码更清晰。但是,如果您将使用IDisposable的用法封装在using语句中,则显式调用Dispose会自动完成,如this page所述。
答案 4 :(得分:0)
让.NET调用dispose:
using ( Socket mySocket = new Socket( ... ) ) {
// Do stuff with socket, then bring it down nicely
} // Dispose gets called returning the unmanaged system resources
答案 5 :(得分:0)
你是对的。文档不明确,因为在dispose方法中写入了你应该调用Dispose()来清理套接字非托管资源,但另一方面,Close应该这样做。我想Close会调用Dispose或相反。文件支持相同的行为,因此这是一种有根据的猜测。