代码之家  ›  专栏  ›  技术社区  ›  Kevin

关闭插座后,我应该手动处理它吗?

  •  31
  • Kevin  · 技术社区  · 14 年前

    我还要打电话吗 Dispose() 在我的插座上 之后 关闭它?

    例如:

    mySocket.Shutdown(SocketShutdown.Both);
    mySocket.Close();
    mySocket.Dispose(); // Redundant?
    

    我想知道是因为 the MSDN documentation 如下所示:

    关闭套接字连接并释放所有关联的资源。

    6 回复  |  直到 11 年前
        1
  •  38
  •   Mark Byers    14 年前

    在内部调用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
  •  20
  •   Alex Reitbort    14 年前

    在这种情况下,关闭和处置是相同的。当MS在.NET 1中引入Dispose模式时,Dispose字不是很容易发现。因此,指导方针是添加特定于上下文的关键字,这些关键字将执行相同的功能,并且更容易被用户发现。像关闭文件和套接字。

        3
  •  6
  •   Erv Walter    14 年前

    按照惯例,应该始终对实现IDisposable的任何内容调用Dispose。你永远不知道除了显而易见的事情,它还能做什么。

    如果您碰巧使用Reflector来查看,事实上,目前并不需要它,那么您不应该假设内部实现在某个时刻可能发生变化。

    调用Dispose永远不会有什么坏处。只要做到这一点:

        4
  •  2
  •   Andy    14 年前

    许多人通常认为关闭IDisposable对象是一种最佳实践,因为它使代码更清晰。但是,如果在using语句中封装IDisposable的用法,则显式调用Dispose将自动完成,如 this page 描写。

        5
  •  0
  •   Walt Stoneburner    14 年前

    让.NET调用Dispose:

    using ( Socket mySocket = new Socket( ... ) ) {
      // Do stuff with socket, then bring it down nicely
    }  // Dispose gets called returning the unmanaged system resources
    
        6
  •  0
  •   Ikaso    14 年前

    你是对的。文档不清楚,因为在Dispose方法中,编写的文档应该调用Dispose()来清理套接字非托管资源,但另一方面,Close也应该这样做。我想是近距离处置还是相反。同样的行为也得到了文件的支持,所以这是一个有根据的猜测。