面试题—IDisposable using本质IL解析
4月离开了上一家公司,有些不舍,但是还是离开了。找工作还是比较幸运,很快就面试上了一大公司。在面试过程中有几道比较有意思的题,特地拿出来更新下博客,博客也好久没更新了,。
今天说一个简单的问题就是实现IDisposable接口的类的using用法的本质,其实这个是在[你必须知道的.NET]第十六回:深入浅出关键字---using全接触 中有讲解。我面试前并不知道。我带着猜测的回答了这个问题,我给面试官说:我猜测IL是try{}catch{}finally{},如果能给我Reflector,我肯定能解决,查看基本IL就知道了。
于是面试完了回家,我打开电脑,测试了下:测试代码:
1 using System.Data.SqlClient;
2
3 namespace BlogSample
4 {
5 public class DisposeSubstance
6 {
7 public void DisposeDemo()
8 {
9 using (SqlConnection con = new SqlConnection("ConnectionString"))
10 {
11 var cmd = new SqlCommand();
12 cmd.Connection = con;
13 cmd.CommandText = "sql";
14 con.Open();
15 cmd.ExecuteNonQuery();
16 con.Close();
17 }
18 }
19 }
20 }
2
3 namespace BlogSample
4 {
5 public class DisposeSubstance
6 {
7 public void DisposeDemo()
8 {
9 using (SqlConnection con = new SqlConnection("ConnectionString"))
10 {
11 var cmd = new SqlCommand();
12 cmd.Connection = con;
13 cmd.CommandText = "sql";
14 con.Open();
15 cmd.ExecuteNonQuery();
16 con.Close();
17 }
18 }
19 }
20 }
Reflector反编译IL代码:
从上面可以看出来,是try{}finally{},讲Dispose方法放在finally中处理。
IDisposable是一种处理了.net非托管资源垃圾回收机制的方案。本质接口的Dispose方法在finally方法中处理。
推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架