Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#使用关键字-嵌套在单行中_C#_Using Statement - Fatal编程技术网

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变量作用域的末尾(在本例中是在方法的末尾)处理流和读取器

请参阅更多:

  • 中更详细的描述

第一句很好(+1),但剩下的,这(和TomTom)不就是语法上的甜点吗?它实际上与原始代码完全相同,不是吗?@Lazarus-它做同样的事情,但(重要的)它阻止嵌套将代码推离屏幕右侧-p说真的,我们在这里封装了一个单元,所以单级视觉嵌套似乎是可取的。我没有意识到这会停止缩进,它的操作与if语句不同,if语句缩进,即使省略了单行块的括号。我学到了一些东西。。。今天天气不错;)事实上,我喜欢第一种形式的删除——带括号。它得到适当的处理,是最容易维护的IMHO。
using (var xmlReader = new XmlTextReader( xmlUrl ))
{
   ...
}
private static void NewMultipleUsingDeclarations()
{
    using var xmlStream = client.OpenRead(xmlUrl);
    using var xmlReader = new XmlTextReader(xmlStream);
    
    // use xmlReader 
}