【问题标题】:Is it OK to use `using` like this? [duplicate]像这样使用`using`可以吗? [复制]
【发布时间】:2013-01-15 20:31:00
【问题描述】:

可能重复:
Nested using statements in C#

我非常喜欢 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)作为它的“主体” .

谁能确认这是否正确? (description of the using statement 没有帮助)。

【问题讨论】:

  • 它确实有效。如果没问题,就在你和你的编码风格之间。
  • 是的,完全正确:)
  • 它编译得很好我唯一要说的是,为了可读性和一致性,坚持使用围绕{ }包装代码块的风格
  • 对不起,我实际上没有答案,只是想说我喜欢后一种方法并经常使用它来减少嵌套,尤其是在使用 sql 命令/连接等时跨度>
  • @hoang 我认为对未来的读者省略花括号更友好。它使代码更容易阅读,而不是更难,并且是一种足够常见的模式,应该不会太令人惊讶。

标签: c#


【解决方案1】:

是的,您建议的代码

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

既可以,也很常见。

你不需要在每个使用之后使用额外的{}(除了包含other code的那个,如果other code是多个语句),因为每个 using 后面都只有一个语句。

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

也可以。

【讨论】:

  • 这也适用于任何结构化语句,如ifwhile 等。
  • @OlivierJacot-Descombes 除了try/catchHere's why
【解决方案2】:

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

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

embedded-statement 是来自以下的任何内容(参见第 A2.5 项):

嵌入式语句

空语句
表达式语句
选择声明
迭代语句
跳转语句
尝试语句
检查语句
未经检查的声明
锁定语句
使用语句
产量声明

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

【讨论】:

  • 感谢所有回复的人,很抱歉我不能接受你们所有人,但我认为最好接受这个答案 - 这是明确的/有证据支持的。
【解决方案3】:

是的,这是正确的。

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

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

【讨论】:

    【解决方案4】:

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

    关于 SO 对此进行了长时间的讨论:Why is it considered a bad practice to omit curly braces? 在帖子中,OP 特别提到了 using 语句。它可能值得一读。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2011-03-11
      • 2013-02-08
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多