Se vi siete imbattuti in qualche codice C# come questo con nidificati che utilizzano le dichiarazioni/risorse:.NET - Sostituzione annidati usando affermazioni con un'unica istruzione using
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
using (var reader = new BinaryReader(responseStream))
{
// do something with reader
}
}
}
E 'sicuro di sostituirlo con qualcosa di simile?
using (var reader = new BinaryReader(((HttpWebResponse)request.GetResponse()).GetResponseStream()))
{
// do something with reader
}
L'esempio sopra è solo un esempio delle risorse disponibili nidificati, così mi perdoni se non è esattamente corretto utilizzo. Sono curioso di sapere se quando smaltisci la risorsa più esterna (il BinaryReader in questo caso), se distribuirà ricorsivamente i suoi figli per te, o se hai bisogno di disporre esplicitamente di ogni "layer" con istruzioni using separate? Per esempio. se si dispone di BinaryReader, è necessario disporre il flusso di risposta, che a sua volta dispone la risposta? Pensare a quell'ultima frase mi fa pensare che in realtà hai bisogno delle istruzioni using separate, perché non c'è modo di garantire che un oggetto wrapper possa disporre dell'oggetto interno. È giusto?
Hai bisogno di loro, ma non credo che debbano essere annidati. Penso che possano essere impilati uno sopra l'altro. –
@Matt: Sì, ma devono esistere tutti e tre. –
'BinaryReader.Close' chiude il flusso sottostante. E poiché 'Stream.Close' finisce per chiamare' Stream.Dispose', non è necessario chiudere lo stream dopo aver chiuso il lettore. Vedere http://msdn.microsoft.com/en-us/library/system.net.httpwebresponse.aspx e http://msdn.microsoft.com/en-us/library/system.io.stream.close.aspx . –