2010-03-09 36 views
8

Por lo general, yo estaba haciendo algo por el estilo (sólo un ejemplo):C# con en palabras clave anidado en una sola línea

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

¿No es mejor que hacer simplemente:

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

Pero estoy no estoy seguro de si en esta breve sintaxis se eliminarán todos los recursos (Stream) o solo XmlTextReader?

Gracias de antemano por su respuesta.

+0

De hecho me gusta la primera forma de delenciación - con los corchetes. Se elimina correctamente y es más fácil de mantener en mi humilde opinión. –

Respuesta

20

No; eso no garantiza que el Stream esté dispuesto si el constructor XmlTextReader lanza una excepción. Pero se puede hacer:

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

La primera oración es excelente (+1 para eso) pero el resto, ¿no es esto (y TomTom) solo azúcar sintáctico? En realidad es idéntico al código original, ¿no? – Lazarus

+0

@Lazarus: hace lo mismo, pero (lo que es más importante) detiene el anidamiento al presionar el código en el lado derecho de la pantalla ;-p Con toda seriedad, estamos encapsulando una sola unidad aquí, por lo que un solo nivel de * visual * nesting parece deseable. –

+0

No me di cuenta de que esto detendría la sangría, funciona de manera diferente a una instrucción if que sangra incluso si omite los corchetes para los bloques de una sola línea. Aprendí algo ... es un buen día;) – Lazarus

2

¿Qué pasa con (yo uso esto ahora):

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

La segunda es el uso de referenciado usando desde la primera - no hay necesidad de tener soportes.

2

La referencia documentation indica que el objeto a eliminarse debe declararse en la instrucción using. Como no hay una declaración para la transmisión, no se llamará al método Dispose.

En su caso, puede omitir la secuencia por completo, y utilizar el constructor para el TextReader que toma un parámetro url. La secuencia subyacente se cerrará cuando se elimine el lector.

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