C#使用关键字嵌套在单行中

时间:2010-03-09 12:24:20

标签: c# using-statement

通常我做的就是这样(只是一个例子):

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

不仅仅是做得更好:

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

但是我不确定在这个简短的语法中是否会处理所有资源(Stream)或仅处理XmlTextReader?

提前感谢您的回答。

4 个答案:

答案 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 ))
{
   ...
}