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