我一直在寻找在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#规格说,
当资源获取采用局部变量声明的形式时,可以获取给定类型的多个资源.表格的使用声明
Run Code Online (Sandbox Code Playgroud)using (ResourceType r1 = e1, r2 = e2, ..., rN = eN) statement恰好等同于嵌套的using语句序列:
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
是的,这两段代码是等价的.
刚用Reflector测试了这个.两个版本都发出了完全相同的IL,Reflector反编译为以下C#:
using (new SqlConnection())
{
using (new SqlConnection())
{
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,对于这两个版本,即使在构造函数中抛出异常,也会在两个实例上调用Dispose.
是的,根据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