C# 使用'的不同方式;C中的s#
我一直在考虑在C#中使用,我想知道下面的代码是否等效C# 使用'的不同方式;C中的s#,c#,C#,我一直在考虑在C#中使用,我想知道下面的代码是否等效 using (SqlConnection connection1 = new SqlConnection(), connection2 = new SqlConnection()) { } 遵守本守则 using (SqlConnection connection1 = new SqlConnection()) using (SqlConnection connection2 = new SqlConnection()) { } 是的,这
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() )
{
...
}
所以你最好使用后者。(就我个人而言,我觉得它读起来也更好)我会说它们是一样的,但我可能错了。。。你可以测试一下,两者是等价的。请看下面的问题:我个人认为第二个问题更容易阅读。