C# 是否需要处置从TcpListener等返回的对象

C# 是否需要处置从TcpListener等返回的对象,c#,.net,C#,.net,TcpListener函数AcceptTcpClient()(及其异步朋友)返回一个TcpClient,它实现了IDisposableTcpClient.GetStream()依次返回一个流,该流也是一次性的。我应该处理这些东西吗 例如,这是正确的吗 using (var client = listener.EndAcceptTcpClient(result)) using (var stream = client.GetStream()) using (var writer = new Str

TcpListener
函数
AcceptTcpClient()
(及其异步朋友)返回一个
TcpClient
,它实现了
IDisposable
TcpClient.GetStream()
依次返回一个流,该流也是一次性的。我应该处理这些东西吗

例如,这是正确的吗

using (var client = listener.EndAcceptTcpClient(result))
using (var stream = client.GetStream())
using (var writer = new StreamWriter(stream, Encoding.ASCII))
using (var reader = new StreamReader(stream, Encoding.ASCII))
{
   //some code
}

另外,当我的
writer
reader
被释放时,它们不会都试图关闭同一个流对象吗?

第一个问题的简短答案是肯定的。您应该处理所有实现IDisposable的对象。有几个类确实实现了IDisposable,但实际上不需要处理,但这些类通常是因为它继承了Microsoft希望成为泛型的其他类,而且他们的一些/许多/大部分目标实现可能/确实需要处理,因此即使在他们自己不需要处理的实现上,接口也存在


第二个问题的答案是否定的。处理编写器和读取器不应该关闭流,因为流是它自己的对象,有它自己的生命周期。仅仅因为作者/读者不在了,并不意味着你们就不再使用流了,但唉。。。在.NET中有一些类不遵循这一点,他们确实会关闭和/或试图处理传递给他们的对象,而实际上他们不应该这样做。

正如你在
close
中看到的那样,方法只是调用
dispose
dispose
设置和检查
m_CleanedUp
flagWCF客户端就是因为这个而臭名昭著的-
IDisposable
的实现是有缺陷的它将尝试关闭不可关闭的通道(例如,出现故障的通道)。