私は、C# で「正しい」ネットワーク コードを記述する最善の方法について、多くの調査を行ってきました。
C# の "using" ステートメントを使用した多くの例を見てきました。これは良いアプローチだと思いますが、さまざまな式で一貫性のない使用方法を見てきました。
たとえば、次のようなコードがあるとします。
TcpClient tcpClient = new TcpClient("url.com", 80);
NetworkStream tcpStream = tcpClient.GetStream();
StreamReader tcpReader = new StreamReader(tcpStream);
StreamWriter tcpWriter = new StreamWriter(tcpStream);
明らかに、このコードは非常に不安定になります。それで、tcpClient を使用するコードを見てきましたが、これは良さそうです。しかし、NetworkStream にもクリーンアップが必要なリソースはありませんか? StreamReader/Writer はどうですか?
ネストされた using ステートメントで 4 つのステートメントすべてをラップする必要がありますか?
もしそうなら、処分する時が来たらどうなりますか?StreamWriter はストリームを閉じず、その結果ソケットを閉じませんか? では、StreamReader、NetworkStream、TcpClient がそれぞれ破棄されるとどうなるでしょうか?
これは別の質問を引き起こします。StreamReader と StreamWriter の両方が同じストリームで構成されている場合、誰がそれを所有しますか? 二人とも自分が所有していると思って、破壊しようとしているのではありませんか? それとも、フレームワークはストリームが既に破棄されていることを認識しており、黙って無視しているのでしょうか?
using ステートメントはチェーンの最後のステートメントにのみ必要なように思えますが、GetStream() で例外がスローされた場合はどうなるでしょうか? その場合、ソケットが適切にクリーンアップされるとは思わないので、これが起こらないようにするために冗長な使用が必要なようです。
例外処理とリソース管理に関する章を含む、.net とできれば c# を使用したネットワーク プログラミングに関する優れた最近の本を知っている人はいますか? または、オンラインの良い記事はありますか?私が見つけることができるすべての本は .NET 1.1 時代 (Microsoft .NET Framework のネットワーク プログラミング、.NET でのネットワーク プログラミングなど) のものであるため、これは適切なリソースが必要なトピックのようです。
編集:
マークの非常に良いコメントが、他の誰かがこれについてコメントするのを止めさせないでください:)
特に非同期の使用に関して、リソース管理に関する本の推奨事項や意見を誰か他の人に聞いてみたいです。