TcpClient资源处理

本文关键字:处理 资源 TcpClient | 更新日期: 2023-09-27 18:15:38

假设我有一个通过TcpClient.GetStream()生成的Stream。如果是stream.Dispose(),是否需要处理创建StreamTcpClient

TcpClient资源处理

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

然而,无论如何,我都不相信这是一个好主意。

我想问您为什么要避免在TcpClient的实例上调用Dispose()TcpClient实现IDisposable的事实所隐含的约定是,当不再需要实例时,应该调用Dispose()

如果你违反了这份合同:

  • 这会让代码的未来维护人员感到困惑吗
  • 如果TcpClient的实现在未来版本中发生变化,该怎么办

好。我从Reflector出来亲自检查了一下。如果在TcpClient上调用GetStream,它会将成员m_DataStream初始化为非null值。

TcpClient的dispose方法的主体看起来像这样:

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

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

因此,据我所知,如果我处理流,就没有必要处理TcpClient。

有人不同意吗?