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

时间:2013-01-31 16:46:25

标签: c#

  

可能重复:
  Nested using statements in C#

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

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

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

var foo = new ObjectiWhichMustBeDisposed();

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

它不仅更具可读性,还可以防止在foo语句之后(即在处置之后)意外使用using变量,而在第二个示例中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)as它的“身体”。

任何人都可以确认这是否正确? (description of the using statement没有帮助。)

4 个答案:

答案 0 :(得分:7)

是您建议的代码

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
}

也没关系。

答案 1 :(得分:2)

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

  

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

嵌入式语句是以下内容(参见条款A2.5):

  

嵌入语句
     块
     空语句
     表达式语句
     选择语句
     迭代语句
     跳转语句
     尝试语句
     检查语句
     未经检查的语句
     锁定声明
     使用语句
     收益率陈述

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

答案 2 :(得分:1)

是的,这是正确的。

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

所以其余的由你决定。如果您喜欢这种编码方式,请使用它。

答案 3 :(得分:1)

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

关于此问题,我们就此进行了长时间的讨论:Why is it considered a bad practice to omit curly braces?在OP的帖子中,OP特别提到了使用陈述。这可能值得一读。