6

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

我非常喜欢usingC# 中的声明。我发现这个:

using (var foo = new ObjectWhichMustBeDisposed())
{
    other code
}

...比这更具可读性:

var foo = new ObjectiWhichMustBeDisposed();

try
{
    other code
}
finally
{
    foo.Dispose();
}

它不仅更具可读性,还可以防止在语句之后(即在它被释放之后)意外使用foo变量,而在第二个示例中,可以在它被释放之后使用。usingfoo

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

using (var foo = new ObjectWhichMustBeDisposed())
{
    using (var bar = new ObjectWhichMustBeDisposed())
    {
        other code
    }
}

如果两个对象属于同一类型,则可以将它们组合成一个using语句,如下所示:

using (var foo = new ObjectWhichMustBeDisposed(),
           bar = new ObjectWhichMustBeDisposed())
{
    other code
}

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

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

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
{
    other code
}

在这种情况下,第一次使用后没有大括号(因此不需要缩进代码)。这编译,我假设这就像一个if没有大括号的语句一样工作 - 即它将使用下一个语句(using在这种情况下是第二个)作为它的“主体”。

谁能确认这是否正确?(使用语句的描述没有帮助)。

4

4 回答 4

7

是的,您提出的代码

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
{
    other code
}

既可以,也很常见。

您不需要在每次using之后使用额外的 { } (除了包含其他代码的那个,如果其他代码不止一个语句),因为每个 using 后面都有一个语句。

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
using (var baz = new OtherObjectWhichMustBeDisposed())
using (var quux = new OtherObjectWhichMustBeDisposed())
{
    other code
}

也可以。

于 2013-01-31T16:48:41.617 回答
2

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

12.3.3.17 Using 语句
对于以下形式的 using 语句 stmt:
using (resource-acquisition) embedded-statement

嵌入语句是来自以下的任何内容(参见第 A2.5 项):

嵌入式语句

空语句
表达式语句
选择语句
迭代语句
跳转语句
尝试语句
检查语句
未检查语句
锁定语句
使用语句
屈服语句

using因此,从 C# 标准的角度来看,(块或其他 using 语句)的两种用法是绝对等价的。

于 2013-01-31T17:07:10.113 回答
1

是的,这是正确的。

using (var foo = new ObjectWhichMustBeDisposed())
using (var bar = new OtherObjectWhichMustBeDisposed())
{
    other code
}

所以剩下的就看你了。如果你喜欢这种编码方式,那就去吧。

于 2013-01-31T16:48:49.563 回答
1

是的,这是正确的;但是,这对您来说可能不是很好的编码风格。

对此进行了长时间的讨论:为什么省略花括号被认为是一种不好的做法?在帖子中,OP 特别提到了 using 语句。它可能值得一读。

于 2013-01-31T16:53:56.710 回答