Wenn Sie über einige C# Code wie folgt mit verschachtelten mit Aussagen/Ressourcen kam:.NET - verschachtelt Ersetzen Aussagen mit einzelnen mit Anweisung using
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var reader = new BinaryReader(responseStream))
{
// do something with reader
}
}
}
Ist es sicher, es mit etwas zu ersetzen?
using (var reader = new BinaryReader(((HttpWebResponse)request.GetResponse()).GetResponseStream()))
{
// do something with reader
}
Das obige Beispiel ist nur ein Beispiel für geschachtelte Einwegressourcen, also vergib mir, wenn es nicht genau die richtige Verwendung ist. Ich bin neugierig, wenn Sie die äußerste Ressource (den BinaryReader in diesem Fall) entsorgen, wenn sie rekursiv ihre untergeordneten Elemente für Sie abstellt oder wenn Sie jede "Schicht" explizit mit separaten using-Anweisungen entsorgen müssen? Z.B. Wenn Sie den BinaryReader entsorgt haben, soll er den Antwortstream entlasten, der wiederum die Antwort entbindet? Wenn ich über diesen letzten Satz nachdenke, denke ich, dass Sie die separaten using-Anweisungen brauchen, weil es keine Möglichkeit gibt, zu garantieren, dass ein Wrapper-Objekt über das innere Objekt verfügen würde. Ist das richtig?
Sie brauchen sie, aber ich glaube nicht, dass sie verschachtelt werden müssen. Ich denke, sie können einfach übereinander gestapelt werden. –
@Matt: Ja, aber sie müssen alle drei existieren. –
'BinaryReader.Close' schließt den zugrunde liegenden Stream. Und da 'Stream.Close' letztendlich' Stream.Dispose' aufruft, muss der Stream nach dem Schließen des Readers nicht geschlossen werden. Siehe http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx und http://msdn.microsoft.com/en-us/library/system.io.stream.close.aspx . –