日期:2014-05-16  浏览次数:20928 次

不用using关键字的时候,实现了IDisposable接口的对象,会在作用域之外释放吗?
本帖最后由 u013761502 于 2014-02-26 08:59:34 编辑
<<C#入门经典>>第五版里面这样说:
   IDisposable 接口特别有趣。支持IDisposable 接口的对象必须实现其Dispose()方法,即它们必须
提供这个方法的代码。当不再需要某个对象(例如,在对象超出作用域之前)时,就调用这个方法,
释放重要的资源,否则,该资源会等到对垃圾回收调用析构方法时才释放。这样可以更好地控制对
象所使用的资源。
    C#允许使用一种可以优化使用这个方法的结构。using 关键字可以在代码块中初始化使用重要
资源的对象,会在这个代码块的末尾自动调用Dispose()方法

我于是做了一个实验有下面这样的代码:

    struct m : IDisposable
    {
        #region IDisposable Members
        public void Dispose()
        {
            Console.WriteLine("abc");
        }
        #endregion
    }
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i < 3; ++i)
            {
                Console.ReadKey();
                m obj = new m();
            }
        }
    }

我期待的结果是,因为变量obj声明在for的内部,每次for进入下一次循环的时候,就是obj已经超出了作用域,上一次的obj就无效了,应该被Dispose。但是我运行发现,并没有打印我期待的3次"abc"啊。

这是为什么呢? 代码应该怎么改,还是我的理解有偏差? 谢谢。
------解决方案--------------------
你的理解有偏差,IDisposable仅仅是一个接口,没有多么神奇的功能,只是using的语法特殊照顾了这个接口而已。