TcpClient资源处理
本文关键字:处理 资源 TcpClient | 更新日期: 2023-09-27 18:15:38
假设我有一个通过TcpClient.GetStream()
生成的Stream
。如果是stream.Dispose()
,是否需要处理创建Stream
的TcpClient
?
看看ILSpy中TcpClient.GetStream
和TcpClient.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。
有人不同意吗?