透过现象看本质,从MSIL看using语句

例如一个简单的数据库打开关闭操作:

static void Main(string[] args)
{
    using (SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=mzwucom;Integrated Security=SSPI;"))
    {
        conn.Open();
        conn.Close();
    }

    Console.ReadKey();
}

用Ildasm.exe查看MSIL代码:

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       54 (0x36)
  .maxstack  2
  .locals init ([0] class [System.Data]System.Data.SqlClient.SqlConnection conn,
           [1] bool CS$4$0000)
  IL_0000:  nop
  IL_0001:  ldstr      "Data Source=.;Initial Catalog=mzwucom;Integrated S"
  + "ecurity=SSPI;"
  IL_0006:  newobj     instance void [System.Data]System.Data.SqlClient.SqlConnection::.ctor(string)
  IL_000b:  stloc.0
  .try
  {
    IL_000c:  nop
    IL_000d:  ldloc.0
    IL_000e:  callvirt   instance void [System.Data]System.Data.Common.DbConnection::Open()
    IL_0013:  nop
    IL_0014:  ldloc.0
    IL_0015:  callvirt   instance void [System.Data]System.Data.Common.DbConnection::Close()
    IL_001a:  nop
    IL_001b:  nop
    IL_001c:  leave.s    IL_002e
  }  // end .try
  finally
  {
    IL_001e:  ldloc.0
    IL_001f:  ldnull
    IL_0020:  ceq
    IL_0022:  stloc.1
    IL_0023:  ldloc.1
    IL_0024:  brtrue.s   IL_002d
    IL_0026:  ldloc.0
    IL_0027:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()

    IL_002c:  nop
    IL_002d:  endfinally
  }  // end handler
  IL_002e:  nop
  IL_002f:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
  IL_0034:  pop
  IL_0035:  ret
} // end of method Program::Main

如红色部分代码所示,在finally块中,先将SqlConnection的实例conn和null比较,若相等则退出finally块,否则再调用Dispose方法来释放资源,所以,使用using语句我们就不需要手动去释放资源了,即使是出错的情况下,using也能保证资源被释放!

评论: 0 | 引用: 0 | 查看次数: 4039
发表评论
登录后再发表评论!