通常,我正在做类似的事情(仅作为示例):
using (Stream xmlStream = client.OpenRead(xmlUrl))
{
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
{
}
}
不是最好只做:
using (XmlTextReader xmlReader = new XmlTextReader(client.OpenRead(xmlUrl)))
{
}
但是我不确定用这种简短的语法处理所有资源(流)还是仅使用XmlTextReader?
感谢您的回答。
否;如果Stream
构造函数引发异常,则不能保证XmlTextReader
会被丢弃。但您可以这样做:
using (Stream xmlStream = client.OpenRead(xmlUrl))
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
{
// use xmlReader
}
关于(我现在使用这个):
using (Stream xmlStream = client.OpenRead(xmlUrl))
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
{
...
}
第二个用法是从第一个引用的用法-不需要括号。
引用documentation指示必须在using语句中声明要处置的对象。由于没有流的声明,因此不会调用Dispose方法。
但是,在您的情况下,您可以完全跳过流,并为带有url参数的TextReader使用构造函数。放置阅读器时,基础流将关闭。
using (var xmlReader = new XmlTextReader( xmlUrl ))
{
...
}
使用C#8,您甚至可以摆脱单个嵌套级别:
private static void NewMultipleUsingDeclarations()
{
using var xmlStream = client.OpenRead(xmlUrl);
using var xmlReader = new XmlTextReader(xmlStream);
// use xmlReader
}
内部,编译器创建与缩进版本等效的try catch,并在使用变量范围的末尾(在这种情况下,在方法末尾)处置流和读取器。
查看更多: