使用块命令对象关闭连接?

using block for command object close connection?

我对下面的编码有点困惑。它们是一样的吗?如果不是,哪一个是最好的,为什么?

//Two using blocks for Command and Connection
using (var cn = new OracleConnection(connectionString))
using (var cmd = new OracleCommand(sql, cn))
{
}


//One using block for Command and Connection
using (var cmd = new OracleCommand(sql, new OracleConnection(connectionString)))
{
}

首先假设您不小心添加了一个额外的 )(否则两者都不会编译)然后第一个示例将正确处理命令和连接,而第二个将仅处理命令。

这是第一个的等效代码。

OracleConnection cn = new OracleConnection(connectionString);
try
{
    OracleCommand cmd = new OracleCommand(sql, cn);
    try
    {
        // Use cmd and cn here.
    }
    finally
    {
        if(cmd != null)
            ((IDisposable)cmd).Dispose();
    }
}
finally
{
    if(cn != null)
        ((IDisposable)cn).Dispose();
}

第二个

OracleCommand cmd = new OracleCommand(sql, new OracleConnection(connectionString));
try
{
    // Use cmd here.
}
finally
{
    if(cmd != null)
        ((IDisposable)cmd).Dispose();
}

另请注意,您只能创建多个实例,如果它们都是同一类型,这些实例将全部被处置。如有关 using 的 MSDN 页面中的以下示例所示。

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}