C#使用关键字-嵌套在单行中
通常我是这样做的(只是一个例子): 这样做不是更好吗C#使用关键字-嵌套在单行中,c#,using-statement,C#,Using Statement,通常我是这样做的(只是一个例子): 这样做不是更好吗 using (XmlTextReader xmlReader = new XmlTextReader(client.OpenRead(xmlUrl))) { } 但我不确定在这个简短的语法中,是所有资源都将被释放(流),还是只有XmlTextReader 提前感谢您的回答。否;如果XmlTextReader构造函数抛出异常,这不能保证流被释放。但你可以做到: using (Stream xmlStream = client.OpenRead
using (XmlTextReader xmlReader = new XmlTextReader(client.OpenRead(xmlUrl)))
{
}
但我不确定在这个简短的语法中,是所有资源都将被释放(流),还是只有XmlTextReader
提前感谢您的回答。否;如果
XmlTextReader
构造函数抛出异常,这不能保证流
被释放。但你可以做到:
using (Stream xmlStream = client.OpenRead(xmlUrl))
using (XmlTextReader xmlReader = new XmlTextReader(xmlStream))
{
// use xmlReader
}
那么(我现在用这个):
第二个using是从第一个using中引用的using-不需要有括号。该引用表示必须在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,并在using变量作用域的末尾(在本例中是在方法的末尾)处理流和读取器
请参阅更多:
- 中更详细的描述
using (var xmlReader = new XmlTextReader( xmlUrl ))
{
...
}
private static void NewMultipleUsingDeclarations()
{
using var xmlStream = client.OpenRead(xmlUrl);
using var xmlReader = new XmlTextReader(xmlStream);
// use xmlReader
}