日期:2014-05-17  浏览次数:20887 次

Dispose()函数实现,似乎并不能导致对象本身被释放啊。
Dispose函数是用来释放对象所使用的资源,对吧?
但是今天碰到一个面试题: 如何用C#强制释放一个对象的内存呢?

我尝试了下面的代码:

    public class c : System.IDisposable
    {
        public c() :base(){ Console.WriteLine("ctor"); }
        ~c() { Console.WriteLine("dtor"); }
        public void Dispose()
        {
            Console.WriteLine("c dispose");
        }
    };
    class Program
    {
        static void Main(string[] args)
        {
            c o1 = new c();
            using (o1)
            {
                Console.WriteLine("During using");
            }
            Console.WriteLine("After using");
        }
    }

运行的结果是:
ctor
During using
c dispose
After using
dtor

我本来的期望是,using关键字限定了o1的生存周期,在using的末尾,o1这个对象本身被释放,也就是应该调用dtor,然后打印After using.

但是事实的结果是using的末尾只是调用Dispose函数而已。析构函数是被GC机制调用的吗?
[问题]:
那么如果我期望能显示的毁掉o1这个对象,应该怎么办呢?


------解决方案--------------------
dispose并不是去释放本身,而是给托管对象一个可以释放它所包含的非托管资源的手段

------解决方案--------------------
dispose释放不了托管对象。
------解决方案--------------------
using 本身就是帮你自动调用 Dispose 方法,没有说帮你从内存里清掉啊,这是 GC 干的事情,GC 负责调用析构函数,清理无用对象,你这个程序太短了,还没到 GC 执行的间隔期。你可以试着手动 GC.Collect(),这样就会调用析构函数了,不过不建议你这么做。因为如果对象一多,平凡的如此搞,性能有影响。