像这样使用“使用”可以吗?

本文关键字:使用 像这样 | 更新日期: 2023-09-27 17:56:56

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

我是 C# 中 using 语句的忠实粉丝。我发现这个:

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

。比这更具可读性:

var foo = new ObjectiWhichMustBeDisposed();
try
{
    other code
}
finally
{
    foo.Dispose();
}

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

但是,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)作为其"主体"。

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

像这样使用“使用”可以吗?

是的,你提出的代码

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

既可以,又很常见。

您不需要在每次使用后使用额外的 { }(如果其他代码是多个语句,则包含其他代码的 { } 除外),因为每次使用后面只有一个语句。

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

也会没事的。

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

12.3.3.17 使用语句
对于格式的 using 语句 stmt:
使用 ( 资源获取 ) 嵌入式语句

嵌入式语句是以下任何内容(见项目A2.5):

嵌入式语句

空语句
表达式语句
选择语句
迭代语句
跳转语句
尝试语句
已检查语句
未选中的语句
锁定语句
使用语句
收益率声明

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

是的,这是正确的。

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

所以剩下的就看你了。如果您喜欢这种编码方式,请使用它。

是的,这是正确的;但是它可能不适合您。

关于这一点,SO进行了长时间的讨论:为什么省略大括号被认为是一种不好的做法?在帖子中,OP特别提到了使用语句。可能值得一读。