不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
透过现象看本质,从MSIL看using语句
编辑:dnawo 日期:2010-05-13
例如一个简单的数据库打开关闭操作:
用Ildasm.exe查看MSIL代码:
如红色部分代码所示,在finally块中,先将SqlConnection的实例conn和null比较,若相等则退出finally块,否则再调用Dispose方法来释放资源,所以,使用using语句我们就不需要手动去释放资源了,即使是出错的情况下,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();
}
{
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
{
.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
发表评论
请登录后再发表评论!