C# 使用'的不同方式;C中的s#

C# 使用'的不同方式;C中的s#,c#,C#,我一直在考虑在C#中使用,我想知道下面的代码是否等效 using (SqlConnection connection1 = new SqlConnection(), connection2 = new SqlConnection()) { } 遵守本守则 using (SqlConnection connection1 = new SqlConnection()) using (SqlConnection connection2 = new SqlConnection()) { } 是的,这

我一直在考虑在C#中使用,我想知道下面的代码是否等效

using (SqlConnection connection1 = new SqlConnection(), connection2 = new SqlConnection())
{
}
遵守本守则

using (SqlConnection connection1 = new SqlConnection())
using (SqlConnection connection2 = new SqlConnection())
{
}

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

编辑 刚刚用反射器测试过。两个版本发出完全相同的IL,Reflector反编译到以下C#:


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

是的,它们完全相同。你可以用反射器来证明这一点

    public void Method1()
    {
        using (SqlConnection connection1 = new SqlConnection())
        using (SqlConnection connection2 = new SqlConnection())
        {
        }
    }

    public void Method2()
    {
        using (SqlConnection connection1 = new SqlConnection(), connection2 = new SqlConnection())
        {
        }
    }
他说,

当一个资源获取需要 局部变量声明的形式, 有可能获得多个 给定类型的资源。使用 表格说明

    using (ResourceType r1 = e1, r2 = e2, ..., rN = eN) statement
精确地等价于一个序列 使用嵌套语句的类型:

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

当然,您可以使用在创建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  
是的,根据:

当一个资源获取需要 局部变量声明的形式, 有可能获得多个 给定类型的资源。使用 表格说明

    using (ResourceType r1 = e1, r2 = e2, ..., rN = eN) statement
使用(资源类型r1=e1,r2=e2,…,rN=eN)

声明是 精确地等价于一系列的 嵌套使用语句:

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

使用(ResourceType r2=e2)


使用(ResourceType rN=eN)

声明


除了对C#8.13中其他答案的出色提及外,当其中一个资源必须更改类型时,还必须重写单子句案例

using( S r1 = new S(), r2 = new S() )
{
  ...
}
当需要将
r2
更改为新类型时,必须

using( S r1 = new S() )
using( T r2 = new T() )
{
  ...
}

所以你最好使用后者。(就我个人而言,我觉得它读起来也更好)

我会说它们是一样的,但我可能错了。。。你可以测试一下,两者是等价的。请看下面的问题:我个人认为第二个问题更容易阅读。