C# TCP客户端资源处理

C# TCP客户端资源处理,c#,stream,dispose,tcpclient,C#,Stream,Dispose,Tcpclient,假设我有一个通过TcpClient.GetStream()生成的流。如果我stream.Dispose(),是否需要处理创建流的TcpClient?确定。我自己出去检查一下。如果在TcpClient上调用GetStream,它会将成员m_数据流初始化为非空值 TcpClient的dispose方法的主体如下所示: IDisposable dataStream = this.m_DataStream; if (dataStream != null)

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

确定。我自己出去检查一下。如果在
TcpClient
上调用
GetStream
,它会将成员m_数据流初始化为非空值

TcpClient的dispose方法的主体如下所示:

        IDisposable dataStream = this.m_DataStream;
        if (dataStream != null)
        {
            dataStream.Dispose();
        }
        else
        {
            //some other disposal strategy
        }
因此,如果我自己处理流,我将执行与TcpClient相同的处理

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


有人不同意吗?

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

然而,我并不认为这是一个好主意

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

如果您违反本合同:

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

(回答删除的注释)如果流存在,则这是TcpClient执行的唯一处理工作。因此,如果我处理流,TcpClient就不必这样做。因此,我不需要处理TcpClient,因为它不会做任何不能通过手动处理流来完成的事情。这是因为我陷入了依赖注入混乱。几乎可以肯定,有一种更好的方法可以解决这个资源清理问题,阅读您的答案提醒我,依赖实现细节是不可靠的。