using语句可以用花括号替换吗?

nan*_*nan 6 c# scope sqlconnection using-statement

我使用using语句SqlConnection.它对性能有好处,因为强制调用Dispose()会更快地释放与池的连接.

但是,我意识到在使用中创建的对象无法重新定义.我不能这样做:

   using (SqlConnection connection = new SqlConnection(connectionString))
   {
       connection.Open();
       //...
       connection = new SqlConnection(connectionString2);
       //...
       connection = new SqlConnection(connectionString3);
   }
Run Code Online (Sandbox Code Playgroud)

我想知道我是否可以替换使用,并做这样的事情:

 {
       SqlConnection connection = new SqlConnection(connectionString);

       connection.Open();
       //...
       connection = new SqlConnection(connectionString2);
       //...
       connection = new SqlConnection(connectionString3);
 }
Run Code Online (Sandbox Code Playgroud)

SqlConnection不会是最后一次入店后}梅开二度.当对象超出范围时,Dispose()会立即被调用吗?

Jus*_*ner 13

不,在第二个例子中,事情不会自动清理(实际上,使用您拥有的代码,您将保持几个连接处于打开状态).

不仅如此,如果在using块内抛出异常,则会丢失自动清理.请记住,using块分解为:

SqlConnection connection = new SqlConnection(connectionString);
try
{
    connection.Open();
    // Do work
}
finally
{
    connection.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

如果你真的使用不同的连接,并且每个连接在块的末尾都是Disposed,我将使用几个使用块:

using(SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    // Do Work
}

// First connection is disposed

using(SqlConnection connection = new SqlConnection(connectionString2))
{
    // Do More Work
}

// Second connection is disposed

using(SqlConnection connection = new SqlConnection(connectionString3))
{
    // Do More Work
}

// Last connection is dipsosed
Run Code Online (Sandbox Code Playgroud)


Ode*_*ded 8

using语句是语法糖,它调用Dispose在其中初始化的对象(),因此您不能像在示例中那样简单地替换它.

您将注意到,在using语句中可以使用的唯一对象是那些实现的对象IDisposable,这可以确保Dispose可以调用它们.

由于文章解释,编译器将改变这一点:

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();

}
Run Code Online (Sandbox Code Playgroud)

对此:

MyResource myRes= new MyResource();
try
{
    myRes.DoSomething();
}
finally
{
    if (myRes!= null)
        ((IDisposable)myRes).Dispose();
}
Run Code Online (Sandbox Code Playgroud)

因此,除非您复制此结构,否则您将无法获得相同的行为.

另外 - 按照你的例子重用变量是不好的做法.读取代码的人可能会认为他们正在查看连接1,当他们实际上看着2或3.可能会导致非常混乱并导致各种问题.