可以像这样使用`using`吗?

Gar*_*ill 6 c#

可能重复:
在C#中使用语句嵌套

我是usingC#声明的忠实粉丝.我发现这个:

using (var foo = new ObjectWhichMustBeDisposed())
{
    other code
}
Run Code Online (Sandbox Code Playgroud)

......比这更具可读性:

var foo = new ObjectiWhichMustBeDisposed();

try
{
    other code
}
finally
{
    foo.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

它不仅更具可读性,而且还防止foousing声明之后(即在声明之后)意外使用变量,而在第二个示例中foo可以在它被处置之后使用.

using但是,一个问题是,如果正在创建大量的一次性对象,它往往会导致非常嵌套的代码.例如:

using (var foo = new ObjectWhichMustBeDisposed())
{
    using (var bar = new ObjectWhichMustBeDisposed())
    {
        other code
    }
}
Run Code Online (Sandbox Code Playgroud)

如果两个对象的类型相同,那么您可以将它们组合成一个using语句,如下所示:

using (var foo = new ObjectWhichMustBeDisposed(),
           bar = new ObjectWhichMustBeDisposed())
{
    other code
}
Run Code Online (Sandbox Code Playgroud)

但是,如果对象的类型不同,那么这将不起作用.

我的问题是,是否可以达到类似的目的:

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
{
    other code
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,第一次使用后没有花括号(因此不需要缩进代码).这个编译,我认为这就像一个if没有大括号的语句 - 即它将使用下一个语句(using在本例中为第二个)作为它的"主体".

任何人都可以确认这是否正确?(using语句描述没有帮助).

Eri*_* J. 7

是的,你建议的代码

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
{
    other code
}
Run Code Online (Sandbox Code Playgroud)

既可以,也很常见.

每次使用后不需要使用额外的{} (除了包含其他代码的代码,如果其他代码不止一个语句),因为每个使用后面只有一个语句.

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
using (var baz = new OtherObjectWhichMustBeDisposed())
using (var quux = new OtherObjectWhichMustBeDisposed())
{
    other code
}
Run Code Online (Sandbox Code Playgroud)

也没关系.


Ale*_*iuk 2

查看usingC#标准中的语句定义:

12.3.3.17 using 语句
对于以下形式的 using 语句 stmt:
using (资源获取)嵌入语句

嵌入语句是以下任意一项(参见条款 A2.5):

嵌入语句

空语句
表达式语句
选择语句
迭代语句
跳转语句
try语句
检查语句
未检查语句
锁定语句
using语句
yield语句

因此,using从 C# 标准的角度来看,(block 或另一个 using 语句) 的两种用法是绝对等效的。