2010-03-09 11 views
8

Di solito stavo facendo qualcosa di simile (solo un esempio):C# utilizzando di parola chiave nidificato in un'unica linea

using (Stream xmlStream = client.OpenRead(xmlUrl)) 
{ 
    using (XmlTextReader xmlReader = new XmlTextReader(xmlStream)) 
    { 
    } 
} 

non è meglio fare proprio:

using (XmlTextReader xmlReader = new XmlTextReader(client.OpenRead(xmlUrl))) 
{ 
} 

Ma sono non sono sicuro se in questa sintassi breve tutte le risorse saranno disposte (Stream) o solo XmlTextReader?

Grazie in anticipo per la risposta.

+0

In realtà mi piace la prima forma di delenzionamento - con le parentesi. Viene smaltito correttamente ed è il più gestibile IMHO. –

risposta

20

No; ciò non garantisce che lo Stream sia disposto se il costruttore XmlTextReader genera un'eccezione. Ma si può fare:

using (Stream xmlStream = client.OpenRead(xmlUrl)) 
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream)) 
{ 
    // use xmlReader 
} 
+1

La prima frase è ottima (+1 per quello) ma il resto, non è questo (e TomTom) solo zucchero sintattico? In realtà è identico al codice originale vero? – Lazarus

+0

@Lazarus - fa la stessa cosa, ma (cosa importante) impedisce al nesting di spingere il codice dalla parte destra dello schermo; -p In tutta serietà, stiamo incapsulando una singola unità qui, quindi un unico livello di * visual * nidificazione sembra desiderabile. –

+0

Non mi sono reso conto che questo avrebbe fermato il rientro, esso funziona in modo diverso rispetto a un'istruzione if che fa rientrare anche se si omettono le parentesi per i blocchi a linea singola. Ho imparato qualcosa ... è una buona giornata;) – Lazarus

2

Che dire (io uso questo ora):

using (Stream xmlStream = client.OpenRead(xmlUrl)) 
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream)) 
{ 
... 
} 

Il secondo utilizzando è il riferimento utilizzando dal primo - non c'è bisogno di avere le staffe.

2

Il riferimento documentation indica che l'oggetto da smaltire deve essere dichiarato nell'istruzione using. Poiché non esiste alcuna dichiarazione per lo stream, il metodo Dispose non verrà chiamato.

Nel tuo caso puoi saltare interamente lo stream, però, e utilizzare il costruttore per TextReader che accetta un parametro url. Il flusso sottostante verrà chiuso quando il lettore viene eliminato.

using (var xmlReader = new XmlTextReader(xmlUrl)) 
{ 
    ... 
}