1

我有一个类,其中一个套接字被定义为一个成员对象。如果我想销毁此类的对象(设置为 null),我是否需要 .Close() 套接字

4

2 回答 2

2

简而言之,是的。

理想情况下,您的类将实现IDisposable应该关闭套接字的。不这样做意味着套接字对象可以在内存中持续存在,直到垃圾收集器得到它。如果您计划重新连接到同一个端点,您将不得不这样做,否则底层 Windows 库将引发异常;(特别是错误 10056:在已连接的套接字上发出了连接请求。)

于 2013-09-06T21:05:20.533 回答
1

嗨,我认为您来自 C++ 方面,在 dispose 方法后面调用 C# Close 方法。关闭后,您无需执行任何操作。该对象将被释放,稍后从 GC 将设置为 null。

但是,如果您的班级中有一个套接字作为成员,则必须应用 Dispose 模式!

处置模式

只需在您创建的类的 dispose 方法中处理您的套接字,请参见链接上方。

public class DisposableResourceHolder : IDisposable {

  private Socket socket; // handle to a resource

  public DisposableResourceHolder(){
      this.socket= ... // allocates the resource
  }

  public void Dispose(){
      Dispose(true);
      GC.SuppressFinalize(this);
    }

  protected virtual void Dispose(bool disposing){
      if (disposing){
          if (socket!= null) socket.Dispose(); // HERE DISPOSE
      }
  }
}

如果这可以解决您的问题,请将其标记为答案!

谢谢

于 2013-09-06T21:02:18.583 回答