21

Jon Skeetは、私のSOApiDotNetコード (プレアルファ Stack Overflow API の .NET ライブラリ) について (Twitter 経由で) コメントを残しました。

@ maximz2005ソースをすばやく閲覧しただけで気づいたことの1つは、WebResponsesを破棄していないことです。「使用」ステートメント FTW。

彼は、これらの Web セッションを「using」ステートメントでラップする必要があることを示しています。ただし、これについて質問があります。HttpWebRequest から始めて全体をラップする必要がありますか、それとも「using」ステートメントの外側で WebRequest を作成してから Response を内側にラップする必要がありますか? 違いは、前者では両方のオブジェクトが破棄されるということだと思いますが、これは正しいですか?

前もって感謝します。

4

3 に答える 3

48

HttpWebRequestそれ自体は使い捨てではありませんHttpWebResponse。使い捨てのリソースを using でラップして、早期かつ決定的なクリーンアップを可能にする必要があります。正しく実装されたIDisposableパターンはDispose、問題なく複数の呼び出しを許可するため、外側の using ステートメントでさえリソースをラップし、それ自体が dispose 中に内側の using ステートメント リソースを破棄しても問題ありません。

コード例

var request = (HttpWebRequest)WebRequest.Create("example.com"); 
using (var response = (HttpWebResponse)request.GetResponse()) 
{ 
    // Code here 
}
于 2009-12-28T08:28:03.530 に答える
6

using () {} ブロック (つまり、最初の括弧内) で囲まれたものはすべて、スコープを離れると破棄されます。

私はこれまであなたのライブラリを使用していませんが (いいようですが)、作成したすべての IDisposable を明示的に破棄する (= 責任がある) べきであり、呼び出し元に戻らないでください。

余談ですが、多くの人が複数のものを処分するのに苦労しているのを見てきました。

using (var foo = SomeIDisposable) {
  using (var bar = SomeOtherIDisposable) {
  }
}

あなたが書くことができる多くの垂直スペースを必要とします

using (var foo = SomeIDisposable)
using (var bar = SomeOtherIDisposable) {
}
于 2009-12-28T08:27:52.737 に答える
1

メモリ リークを防ぐために、IDisposable を実装するすべてのオブジェクトで Dispose を呼び出す必要があります。Dispose メソッドは、try-finally ブロックのシンタックス シュガーに過ぎないため、using キーワード (しゃれは意図されていません) を使用して確実に呼び出すことができます。

于 2009-12-28T09:09:27.847 に答える