假设我有一个Stream
通过TcpClient.GetStream()
生产。如果我stream.Dispose()
,是否有必要处置创建Stream
的TcpClient
?TcpClient资源处置
1
A
回答
3
查看ILSpy中的TcpClient.GetStream
和TcpClient.Dispose
的实现,我同意如果您在流上调用Dispose()
但不在客户端上,则不应该有资源泄漏。
不过,我不相信这是一个好主意。
我想问你为什么要避免在TcpClient
的实例上调用Dispose()
。 TcpClient
执行IDisposable
这一事实暗示的合同是当不再需要实例时应调用Dispose()
。
如果破坏这个约定:
- 难道将是混乱的代码以后的维护者?
- 如果
TcpClient
在未来版本中的实现发生了变化,该怎么办?
0
好的。我拿出Reflector自己检查一下。如果你在TcpClient
上调用GetStream
,它会将成员m_DataStream初始化为一个非空值。
的TcpClient的Dispose方法的身体看起来是这样的:
IDisposable dataStream = this.m_DataStream;
if (dataStream != null)
{
dataStream.Dispose();
}
else
{
//some other disposal strategy
}
因此,如果我处理流自己,如TcpClient的执行我执行相同的处理。
所以据我所知,如果我处置流,则不需要处置TcpClient。
有没有人不同意?
+1
(回答删除的评论)如果流存在,那么这是TcpClient执行的唯一处置工作。因此,如果我处理流,TcpClient不必。所以我不需要配置TcpClient,因为它不会通过手动配置流来完成任何操作。 – spender
相关问题
- 1. 处置类资源
- 2. 处置资源的lambda
- 3. 处置静态资源的ViewModels
- 4. C#资源处理
- 5. TcpClient自动处理
- 6. 资源内置Android资源中的$ NotFoundException?
- 7. 处置时托管资源与本地资源有什么区别? (.NET)
- 8. Gradle - 处理外部资源
- 9. 资源处理实践
- 10. 如何处理GDI资源
- 11. 处理缺少的资源
- 12. 处理组装资源
- 13. Spring批处理资源JobRepository
- 14. 资源与资源
- 15. asp.net帮助资源位置
- 16. 图像资源的位置
- 17. C#资源文件设置
- 18. 位置的本地资源
- 19. 资源字符串位置
- 20. Rails设置资源路径
- 21. 从TcpClient/TcpListener查找源程序
- 22. 从TcpClient获取源IP地址
- 23. 如何设置从资源到资源的路由前缀?
- 24. 资源$ NotFoundException:资源ID#0x7f08005e
- 25. 在REST中处理奇异资源
- 26. 获取ninject来处理资源InRequestScope
- 27. 如何处理“加载资源失败”
- 28. 处理资源加载 - 请勿复制
- 29. 以线程处理非托管资源
- 30. Libgdx:模糊处理的游戏资源
这是由于让自己陷入依赖注入纠结的结果。几乎可以肯定有更好的方法来解决这个资源清理问题,阅读你的答案会提醒我依赖于实现细节是不合适的。 – spender