2011年5月17日星期二

  面试题—IDisposable using本质IL解析

      4月离开了上一家公司,有些不舍,但是还是离开了。找工作还是比较幸运,很快就面试上了一大公司。在面试过程中有几道比较有意思的题,特地拿出来更新下博客,博客也好久没更新了,X@8}U9MLE}EBUE273)]9PGF

   今天说一个简单的问题就是实现IDisposable接口的类的using用法的本质,其实这个是在[你必须知道的.NET]第十六回:深入浅出关键字---using全接触 中有讲解。我面试前并不知道。我带着猜测的回答了这个问题,我给面试官说:我猜测IL是try{}catch{}finally{},如果能给我Reflector,我肯定能解决,查看基本IL就知道了。

  于是面试完了回家,我打开电脑,测试了下:测试代码:

using System.Data.SqlClient;

namespace BlogSample
{
    public class DisposeSubstance
    {
        public void DisposeDemo()
        {
            using (SqlConnection con = new SqlConnection("ConnectionString"))
            {
                var cmd = new SqlCommand();
                cmd.Connection = con;
                cmd.CommandText = "sql";
                con.Open();
                cmd.ExecuteNonQuery();
                con.Close();
            }
        }
    }
}

Reflector反编译IL代码:

BILSC$6P~1[9IG4ZDTN4)OS

从上面可以看出来,是try{}finally{},讲Dispose方法放在finally中处理。

IDisposable是一种处理了.net非托管资源垃圾回收机制的方案。本质接口的Dispose方法在finally方法中处理。

没有评论:

发表评论