C# 是否需要同时关闭NetworkStream和TcpClient,还是只关闭TcpClient?
我正在阅读并注意到: 调用此方法最终将关闭关联的套接字,如果创建了关联的网络流,还将关闭用于发送和接收数据的关联网络流 因此,如果我错了,请纠正我,但这表示如果在C# 是否需要同时关闭NetworkStream和TcpClient,还是只关闭TcpClient?,c#,dispose,tcpclient,networkstream,C#,Dispose,Tcpclient,Networkstream,我正在阅读并注意到: 调用此方法最终将关闭关联的套接字,如果创建了关联的网络流,还将关闭用于发送和接收数据的关联网络流 因此,如果我错了,请纠正我,但这表示如果在TcpClient上调用Close(),则NetworkStream也将关闭 那么,为什么在代码示例的末尾都调用了Close() networkStream.Close(); tcpClient.Close(); 只调用tcpClient.Close()是否也一样好?回答这个问题,因为没有其他人这样做,所以我可以接受答案 根据Hans
TcpClient
上调用Close()
,则NetworkStream
也将关闭
那么,为什么在代码示例的末尾都调用了Close()
networkStream.Close();
tcpClient.Close();
只调用
tcpClient.Close()是否也一样好代码>?回答这个问题,因为没有其他人这样做,所以我可以接受答案
根据Hans的说法,调用NetworkStream.Close()是不必要的,因为TcpClient.Close()关闭其底层的NetworkStream。您只需执行“TcpClient.Close()”
或者,如果必须,请同时键入NetworkStream和TcpClient implement IDisposable。因此,在我看来,最好的做法是将其打包到一个using块中,这样您就不需要手动关闭或处理它。关闭客户端并不关闭流,它在GetStream方法的文档中。
作为参考,请查看此讨论:是的,没有必要。在该示例中使用tcpClient.Close()也不是必需的,程序在该示例之后立即终止:)在.NET 3.0之前,必须显式关闭tcpClient和底层NetworkStream。从.NET 3.0开始,在关闭TcpClient时,基础NetworkStream将关闭。TcpClient上的Close()和Dispose()是等效的,Close()添加了一些内部日志记录。这个答案不正确。见薇薇安的答案。如上所述,状态在发送和接收数据时必须关闭网络流。关闭TcpClient不会释放NetworkStream。
但是,调用此方法的状态最终将导致关闭关联的套接字,并且如果创建了用于发送和接收数据的关联NetworkStream,也将关闭该关联的NetworkStream。
我怀疑GetStream文档已过期-该注释自.NET 2.0(当时仍然是一个问题)以来就一直存在.我也有同样的问题,找到了这篇文章,参考源代码证实了TcpClient.Close也调用了NetworkStream的Close,所以这个答案是正确的,那张钞票过期了。它曾经是必要的,但自从.NET3.0以后就不再是了。