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

问题描述 投票:8回答:4

通常,我正在做类似的事情(仅作为示例):

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

不是最好只做:

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

但是我不确定用这种简短的语法处理所有资源(流)还是仅使用XmlTextReader?

感谢您的回答。

c# using-statement
4个回答
22
投票

否;如果Stream构造函数引发异常,则不能保证XmlTextReader会被丢弃。但您可以这样做:

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

2
投票

关于(我现在使用这个):

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

第二个用法是从第一个引用的用法-不需要括号。


2
投票

引用documentation指示必须在using语句中声明要处置的对象。由于没有流的声明,因此不会调用Dispose方法。

但是,在您的情况下,您可以完全跳过流,并为带有url参数的TextReader使用构造函数。放置阅读器时,基础流将关闭。

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

1
投票

使用C#8,您甚至可以摆脱单个嵌套级别:

private static void NewMultipleUsingDeclarations()
{
    using var xmlStream = client.OpenRead(xmlUrl);
    using var xmlReader = new XmlTextReader(xmlStream);

    // use xmlReader 
}

内部,编译器创建与缩进版本等效的try catch,并在使用变量范围的末尾(在这种情况下,在方法末尾)处置流和读取器。

查看更多:

© www.soinside.com 2019 - 2024. All rights reserved.