我应该使用多个嵌套的"using"语句吗?

3
我在想我是否应该在另一个 using 语句内使用 using 语句?例如:
using(SqlConnection con = new SqlConnection(...))
{
    ...
    using(SqlCommand cmd = new SqlCommand(...))
    {

    }
    ...
}

这两个 "using" 是否都必要,或者第一个 "using" 结束时是否已经处理了所有内容?


这可能会有帮助:https://dev59.com/F3M_5IYBdhLWcg3wjj4p - bas
2个回答

4

您需要为每个要处理的对象使用using语句进行处理。

如果您了解一个using语句在大多数情况下是语法糖, 那么您会更好地理解这一点,底层会生成类似于以下的内容:

myObject m = new myObjecyt()
try
{
   // Code here
}
finally
{
   m.Dispose();
}

在当前情境下,可能希望通过单个using块来处理包含的每个对象,但在许多其他情境中,这种行为可能并不理想。


附注:有时候可以不使用多个“using”:在大多数情况下,“StreamReader”/“StreamWriter”将在读取器/写入器被处理时处理其关联的流。虽然这样的代码不会导致泄漏,但是当您为每个“IDisposable”对象使用“using”时,阅读代码会更好/更容易。 - Alexei Levenkov
你回答的方向有点抽象。实际上,这是关于IDisposable契约应该如何工作的问题。大多数人都会同意,对于所有的IDisposables,你应该在“完成”它们后立即处理掉它们。在许多情况下,这是当它超出范围时。然而,在Rx的情况下,IDisposables用于控制事件处理程序的生命周期,因此不应立即处理掉它们...这实际上取决于你正在初始化的资源以及何时发生“使用完毕”。 - Aron

1

你需要两个,因为它们是完全独立的,每一个都处理自己的变量。如果你有多个连续的using语句,也可以像这样编写它们。

using(SqlConnection con = new SqlConnection(...))
using(SqlCommand cmd = new SqlCommand(...))
{
   ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接