欢迎光临

木子屋

标题: 透过现象看本质，从MSIL看using语句

作者: dnawo

日期: 2010-05-13 00:52 AM

分类: Web编程

内容: 例如一个简单的数据库打开关闭操作：
复制内容到剪贴板 程序代码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)

登录

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.758 ms

返回

标题: 透过现象看本质，从MSIL看using语句

你没有权限发表评论

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.758 ms

返回

暂无评论

返回

────────────

木子屋

PJBlog3 v3.2.9.518 Inside.

Processed In 0.789 ms

返回