像这样使用“使用”可以吗?
本文关键字:使用 像这样 | 更新日期: 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特别提到了使用语句。可能值得一读。