C # Использование ключевых слов, вложенных в одну строку - PullRequest
8 голосов
/ 09 марта 2010

Обычно я делал что-то подобное (просто пример):

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

Не лучше просто:

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

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

Заранее спасибо за ваш ответ.

Ответы [ 3 ]

20 голосов
/ 09 марта 2010

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

using (Stream xmlStream = client.OpenRead(xmlUrl))
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
{
    // use xmlReader 
}
2 голосов
/ 09 марта 2010

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

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

using (var xmlReader = new XmlTextReader( xmlUrl ))
{
   ...
}
2 голосов
/ 09 марта 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...