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,因为它不会做任何不能通过手动处理流来完成的事情。这是因为我陷入了依赖注入混乱。几乎可以肯定,有一种更好的方法可以解决这个资源清理问题,阅读您的答案提醒我,依赖实现细节是不可靠的。