【问题标题】:Should I use several nested "using" stements?我应该使用几个嵌套的“使用”语句吗?
【发布时间】:2013-04-21 16:48:34
【问题描述】:

我想知道是否应该在另一个语句中使用 using 语句? 例如:

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

    }
    ...
}

这两个“使用”是否都是必要的,还是第一个使用完成后会丢弃所有东西?

【问题讨论】:

标签: c# sql dispose using


【解决方案1】:

您需要为要处理的每个对象使用using statement

如果您知道using statement 主要是syntactic sugar,我认为您会更好地理解这一点,在引擎盖下会生成这样的东西:

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

在您当前的上下文中可能需要处理包含在单个 using 块中的每个对象,但在许多其他上下文中,这种行为是不可取的。

【讨论】:

  • +1:旁注:在某些情况下,没有多个usingStreamReader/StreamWriter 在大多数情况下会在处理读取器/写入器时处理其关联的流。虽然这样的代码不会导致泄漏,但当每个 IDisposable 对象都有 using 时,阅读代码会更好/更容易。
  • 你的答案是非常元的。它确实是 IDisposable 合同应该如何工作的一个案例。大多数人都会同意,对于所有 IDisposable,您应该在“完成”它们后立即将它们丢弃。在许多情况下,它超出了范围。然而,在 Rx 的情况下,IDisposables 用于控制事件处理程序的生命周期,因此它们不应该立即被释放......实际上取决于您正在初始化的资源是什么以及“完成使用”何时发生......
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多