【发布时间】:2012-01-05 05:31:03
【问题描述】:
假设我有一个通过TcpClient.GetStream() 生成的Stream。如果我stream.Dispose(),是否有必要处理创建Stream的TcpClient?
【问题讨论】:
标签: c# stream dispose tcpclient
假设我有一个通过TcpClient.GetStream() 生成的Stream。如果我stream.Dispose(),是否有必要处理创建Stream的TcpClient?
【问题讨论】:
标签: c# stream dispose tcpclient
查看 ILSpy 中 TcpClient.GetStream 和 TcpClient.Dispose 的实现,我同意如果您在流上而不是在客户端上调用 Dispose(),则不会发生资源泄漏。
但是,无论如何,我并不认为这是一个好主意。
我想问你为什么要避免在TcpClient 的实例上调用Dispose()。 TcpClient 实现 IDisposable 这一事实所暗示的契约是,当不再需要实例时应该调用 Dispose()。
如果您违反本合同:
TcpClient 的实现在未来版本中发生变化怎么办?【讨论】:
好的。我自己拿出 Reflector 来检查一下。如果您在 TcpClient 上调用 GetStream,它会将成员 m_DataStream 初始化为非空值。
TcpClient 的 dispose 方法体如下所示:
IDisposable dataStream = this.m_DataStream;
if (dataStream != null)
{
dataStream.Dispose();
}
else
{
//some other disposal strategy
}
因此,如果我自己处置流,我执行的处置与 TcpClient 执行的处置相同。
据我所知,如果我处理流,则不需要处理 TcpClient。
有人不同意吗?
【讨论】: