2011-11-23 71 views
1

假设我有一个Stream通过TcpClient.GetStream()生产。如果我stream.Dispose(),是否有必要处置创建StreamTcpClientTcpClient资源处置

回答

3

查看ILSpy中的TcpClient.GetStreamTcpClient.Dispose的实现,我同意如果您在流上调用Dispose()但不在客户端上,则不应该有资源泄漏。

不过,我不相信这是一个好主意。

我想问你为什么要避免在TcpClient的实例上调用Dispose()TcpClient执行IDisposable这一事实暗示的合同是当不再需要实例时应调用Dispose()

如果破坏这个约定:

  • 难道将是混乱的代码以后的维护者?
  • 如果TcpClient在未来版本中的实现发生了变化,该怎么办?
+0

这是由于让自己陷入依赖注入纠结的结果。几乎可以肯定有更好的方法来解决这个资源清理问题,阅读你的答案会提醒我依赖于实现细节是不合适的。 – spender

0

好的。我拿出Reflector自己检查一下。如果你在TcpClient上调用GetStream,它会将成员m_DataStream初始化为一个非空值。

的TcpClient的Dispose方法的身体看起来是这样的:

 IDisposable dataStream = this.m_DataStream; 
     if (dataStream != null) 
     { 
      dataStream.Dispose(); 
     } 
     else 
     { 
      //some other disposal strategy 
     } 

因此,如果我处理流自己,如TcpClient的执行我执行相同的处理。

所以据我所知,如果我处置流,则不需要处置TcpClient。

有没有人不同意?

+1

(回答删除的评论)如果流存在,那么这是TcpClient执行的唯一处置工作。因此,如果我处理流,TcpClient不必。所以我不需要配置TcpClient,因为它不会通过手动配置流来完成任何操作。 – spender