2010-03-09 4 views
8

Обычно я делал что-то подобное (только пример):C# Использование вложенных в и по ключевым словам одной линии

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

не лучше сделать просто:

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

Но я не уверен, что в этом коротком синтаксисе будут выделены все ресурсы (поток) или только XmlTextReader?

Заранее благодарим за ваш ответ.

+0

Мне действительно нравится первая форма разложения - с кронштейнами. Он правильно распределяется и наиболее удобен для ИМХО. –

ответ

20

Нет; что не гарантирует, что Stream будет удален, если конструктор XmlTextReader выдает исключение. Но вы можете сделать:

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

Первое предложение отлично (+1 для этого), но остальное, разве это (и TomTom) просто синтаксический сахар? Это на самом деле идентично исходному коду, не так ли? – Lazarus

+0

@ Lazarus - он делает то же самое, но (что важно) он останавливает вложение от нажатия кода с правой стороны экрана; -p. С серьезностью мы инкапсулируем единое целое здесь, поэтому один уровень of * visual * nesting кажется желательным. –

+0

Я не понимал, что это остановит отступ, он работает по-разному с утверждением if, который отступы, даже если вы опускаете скобки для блоков с одной строкой. Я кое-что узнал ... это хороший день;) – Lazarus

2

насчет (я использую это сейчас):

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

Второй используя это ссылаться, используя от первого - нет необходимости иметь скобки.

2

Ссылка documentation указывает, что объект, подлежащий утилизации, должен быть объявлен в операторе using. Поскольку для потока нет объявления, метод Dispose не будет вызываться.

В вашем случае вы можете полностью пропустить поток и использовать конструктор для TextReader, который принимает параметр url. Подлежащий поток будет закрыт, когда читатель будет удален.

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