2016-05-06 17 views
1

私はしばしば "using"ブロックを使ってオブジェクトを破棄します。 今日、私はデータを投稿するためにHttpWebRequestを使用しています。私は2つの方法の間で混乱しています。"using block"を使用すると混乱します - C#

方法1:

var request = (HttpWebRequest)WebRequest.Create("http://www..."); 
using (var writer = new StreamWriter(request.GetRequestStream())) 
{ 
    writer.Write(JsonConvert.SerializeObject(content)); 
} 

方法2:方法2、ブロック "を使用して" 内のすべてのストリームとstreamwirterにおいて

var request = (HttpWebRequest)WebRequest.Create("http://www..."); 
using (var stream = request.GetRequestStream()) 
using (var writer = new StreamWriter(stream)) 
{ 
    writer.Write(JsonConvert.SerializeObject(content)); 
} 

ので、確かにそれが配置されます。しかし、方法1では、私はストリームrequest.GetRequestStream()が処分されるかわからないです。誰も私に説明することはできますか?どうもありがとう!

答えて

9

基本的に、それは2つのことに依存します。

  • null以外Stream参照を渡すときStreamWriterコンストラクタは、これまで例外をスローするかどうか - と私はそれがこのケースではないと思います。ストリームが読み込み専用だった場合は、ストリームが破棄されません。
  • StreamWriter.Disposeのストリームが廃棄されるかどうかは、明示的にconstructor overloadあなたがその

を制御することができますので、基本的に、私はあなたのusing文がStreamを処分しますStreamWriter、を処分するとき...それはこの場合には、安全だと信じ。

ただし、コメントに記載されているように、2つのusing文を使用すると、この種の推論を実行する必要はありません。

+0

したがって、方法1は方法2と同じくらい安全ですか? –

+0

@MinhGiang:そうです。 –

+0

それは本当ですか?何らかの理由でStream.CanWriteがfalseの場合(要求が予測できない場合)、StreamWriterコンストラクタはArgumentExceptionをスローし、基になるストリームが破棄されることがあります。 その可能性は高いとは言いませんが、(方法1のような)いくつかのプラクティスでは、特定の実装(将来も変更される可能性があります)について考える必要があります。これが私が個人的に常に方法2を選択する理由です。 –

5

StreamWriterラッピングすると、Streamは閉じたときにそのストリームを閉じます。 docsを参照してください。

-2

どちらも同じです。 ブロックを使用しているため、匿名オブジェクトも含めてオブジェクト全体が破棄されます。

+0

いいえ、彼らは同じではありません。 'using'ステートメントは、最初の部分で指定されたリソースに対してのみ' Dispose'を呼び出します。 'StreamWriter'がコンストラクタに渡される' Stream'に対して 'Dispose'を呼び出すため、このコードは* only *です。 –

+0

それは本当であるようです。私はhttps://msdn.microsoft.com/es-es/library/system.idisposable.dispose(v=vs.110).aspxを読みました。ありがとうございました – taquion

関連する問題