8

通常我正在做类似的事情(只是一个例子):

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

这样做不是更好:

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

但我不确定在这个简短的语法中是否所有资源都将被处理(流)或只有 XmlTextReader?

提前感谢您的回答。

4

4 回答 4

22

不; 如果构造函数抛出异常,那将不能保证Stream已处置。XmlTextReader但你可以这样做:

using (Stream xmlStream = client.OpenRead(xmlUrl))
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
{
    // use xmlReader 
}
于 2010-03-09T12:26:31.673 回答
7

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

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

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

看更多:

于 2020-04-30T07:50:04.043 回答
2

怎么样(我现在用这个):

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

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

于 2010-03-09T12:27:30.577 回答
2

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

但是,在您的情况下,您可以完全跳过流,并使用带有 url 参数的 TextReader 的构造函数。当读取器被释放时,底层流将被关闭。

using (var xmlReader = new XmlTextReader( xmlUrl ))
{
   ...
}
于 2010-03-09T12:34:00.380 回答