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

时间:2015-04-24 18:02:16

标签: c# ado.net

我对下面的编码感到有点困惑。他们俩都一样吗?如果没有,哪一个是最好的,为什么?

//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)))
{
}

1 个答案:

答案 0 :(得分:1)

首先假设你意外添加了一个额外的)(否则都不会编译),那么第一个例子将正确地处理命令和连接,而第二个例子只会处理命令。

这是第一个的等效代码。

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.
}