2016-05-06 14 views
1

Ich benutze oft die "Verwendung" Block die Objekte zu entsorgen. Heute verwende ich HttpWebRequest, um Daten zu veröffentlichen, und ich fühle mich zwischen zwei Methoden verwirrt.verwirrt bei der Verwendung von "using-Block" - C#

Methode 1:

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

Methode 2:

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

In Verfahren 2 werden alle Strom und streamwirter in Blöcken "verwenden", so wird es sicher entsorgt werden. Aber in Verfahren 1, ich bin nicht sicher, dass Strom request.GetRequestStream() wird entsorgen. Kann mir das jemand erklären? Danke vielmals!

Antwort

9

Grundsätzlich kommt es auf zwei Dinge:

  • Ob der StreamWriter Konstruktor wird jemals eine Ausnahme auslösen, wenn ein Nicht-Null-Stream Verweis übergeben - und ich glaube nicht, wird es in diesem Fall. (Wenn der Stream schreibgeschützt wäre, würde es ... an diesem Punkt würde der Stream nicht entsorgt werden.)
  • Ob StreamWriter.Dispose verfügt über den zugrunde liegenden Stream - und es tut, es sei denn, Sie haben die constructor overload explizit aufgerufen Damit können Sie also im Grunde, dass

kontrollieren, ich glaube, es ist in diesem Fall sicher ist ..., wenn Ihr using Aussage der StreamWriter verfügt über, die der Stream verfügen wird.

Wie bereits erwähnt in den Kommentaren, jedoch mit zwei using Aussagen bedeutet, dass Sie nicht brauchen diese Art von Argumentation auszuführen.

+0

So, Methode 1 ist so sicher wie Methode 2? –

+0

@MinhGiang: Ja genau. –

+0

Sind Sie sicher? Wenn Stream.CanWrite aus irgendeinem Grund falsch ist (etwas Unvorhersehbares passiert mit der Anfrage), wirft der StreamWriter-Konstruktor ArgumentException und der zugrunde liegende Stream wird möglicherweise nicht entsorgt. sagt nicht, seine wahrscheinlich darauf hinweisen, passiert aber, dass einige Praktiken (wie Methode 1) Sie zwingen, über bestimmte Implementierungen zu denken (die auch in Zukunft ändern könnten, natürlich) und einige Praktiken nicht. Das ist der Grund, warum ich persönlich immer Methode 2 wählen würde. –

5

A StreamWriter Umwickeln eines Stream wird, dass Strom schließen, wenn er geschlossen ist. Siehe die docs.

-2

Beide sind gleich. Seit mit Block verfügt über das gesamte Objekt, auch anonyme Objekte.

+0

Nein, sie sind nicht gleich. Die 'using'-Anweisung ruft nur 'Dispose' auf den im ersten Teil angegebenen Ressourcen auf - dieser Code ist * nur * okay, weil' StreamWriter' 'Dispose' auf dem' Stream' aufruft, der an den Konstruktor übergeben wird. –

+0

Das scheint zu stimmen. Ich habe https://msdn.microsoft.com/es-es/library/system.idisposable.dispose(v=vs.110).aspx gelesen. Vielen Dank – taquion