在C#中使用Using的不同方式

Luk*_*asz 14 c#

我一直在寻找在C#中使用,我想知道以下代码是否相同;

using (SqlConnection connection1 = new SqlConnection(), connection2 = new SqlConnection())
{
}
Run Code Online (Sandbox Code Playgroud)

对于这段代码;

using (SqlConnection connection1 = new SqlConnection())
using (SqlConnection connection2 = new SqlConnection())
{
}
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 27

C#规格说,

当资源获取采用局部变量声明的形式时,可以获取给定类型的多个资源.表格的使用声明

    using (ResourceType r1 = e1, r2 = e2, ..., rN = eN) statement
Run Code Online (Sandbox Code Playgroud)

恰好等同于嵌套的using语句序列:

    using (ResourceType r1 = e1)
       using (ResourceType r2 = e2)
          ...
             using (ResourceType rN = eN)
                statement
Run Code Online (Sandbox Code Playgroud)


Jon*_*nna 7

您当然可以在第一个和第二个之间插入一些代码,在创建connection2之前使用connection1.

但你不是,所以没有区别.它们都产生相同的IL:

IL_0000:  newobj      System.Data.SqlClient.SqlConnection..ctor
IL_0005:  stloc.0     
IL_0006:  newobj      System.Data.SqlClient.SqlConnection..ctor
IL_000B:  stloc.1     
IL_000C:  leave.s     IL_0018
IL_000E:  ldloc.1     
IL_000F:  brfalse.s   IL_0017
IL_0011:  ldloc.1     
IL_0012:  callvirt    System.IDisposable.Dispose
IL_0017:  endfinally  
IL_0018:  leave.s     IL_0024
IL_001A:  ldloc.0     
IL_001B:  brfalse.s   IL_0023
IL_001D:  ldloc.0     
IL_001E:  callvirt    System.IDisposable.Dispose
IL_0023:  endfinally  
Run Code Online (Sandbox Code Playgroud)


dri*_*iis 5

是的,这两段代码是等价的.

编辑

刚用Reflector测试了这个.两个版本都发出了完全相同的IL,Reflector反编译为以下C#:

using (new SqlConnection())
{
    using (new SqlConnection())
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,对于这两个版本,即使在构造函数中抛出异常,也会在两个实例上调用Dispose.


cas*_*One 5

是的,根据C#语言规范的第8.13节:

当资源获取采用局部变量声明的形式时,可以获取给定类型的多个资源.表格的使用声明

using (ResourceType r1 = e1, r2 = e2, ..., rN = eN)

语句恰好等同于嵌套的using语句序列:

using (ResourceType r1 = e1)
using (ResourceType r2 = e2)
...
using (ResourceType rN = eN)
    statement