我一直在研究如何最好地用 C# 编写“正确”的网络代码。
我已经看到了许多使用 C# 的“using”语句的示例,我认为这是一个很好的方法,但是我看到它在各种表达式中的使用不一致。
例如,假设我有一些这样的代码:
TcpClient tcpClient = new TcpClient("url.com", 80);
NetworkStream tcpStream = tcpClient.GetStream();
StreamReader tcpReader = new StreamReader(tcpStream);
StreamWriter tcpWriter = new StreamWriter(tcpStream);
显然,这段代码将非常不稳定。所以,我看到了一些将 using 放在 tcpClient 上的代码,这看起来不错。但是,NetworkStream 不是也有需要清理的资源吗?StreamReader/Writer 呢?
我是否需要将所有 4 个语句包装在嵌套的 using 语句中?
如果是这样,到了处置的时候会发生什么?StreamWriter 不会关闭流并因此关闭套接字吗?那么当 StreamReader、NetworkStream 和 TcpClient 分别处理它们时会发生什么?
这就引出了另一个问题。StreamReader 和 StreamWriter 都由同一个流组成,谁拥有它?难道他们不都认为自己拥有它,因此都试图摧毁它吗?或者框架是否知道流已经被销毁并且只是默默地忽略它?
似乎 using 语句仅对链中的最后一条语句是必需的,但是如果在 GetStream() 中抛出异常会发生什么?我认为它不会正确清理套接字,因此似乎有必要使用多余的使用来确保不会发生这种情况。
有没有人知道任何关于使用 .net 进行网络编程的好书,最好是 c#,其中包括关于异常处理和资源管理的章节?或者网上有什么好文章?我能找到的所有书籍都来自 .NET 1.1 时代(Microsoft .NET Framework 的网络编程、.NET 中的网络编程等),所以这似乎是一个需要一些好的资源的主题。
编辑:
请不要让马克的非常好的评论阻止其他人对此发表评论:)
我想听听其他人关于资源管理的书籍推荐或意见,尤其是在异步使用方面。