0

我编码如下:

class myclass : IDisposable
{
    public int a;

    public void Dispose()
    {
        GC.SuppressFinalize(this);
    }
}
class Program
{
    static void Main(string[] args)
    {
        myclass cl = null;
        using (myclass n = new myclass())
        {

            n.a = 10;
            cl = n;
        }

        int a = cl.a;// statement 1
    }
}

我预计语句 1 将不起作用,因为 cl 对象已被释放(n 对象已被释放)。但它工作。那么在声明 1 中是否真的释放了 n 个对象?

4

3 回答 3

7

没有办法显式“释放”托管对象。

Dispose()是一个完全普通的函数,旨在释放非托管资源。
调用它根本不会影响 GC。

于 2013-10-28T16:48:42.743 回答
1

.NET 中的垃圾收集器确保对象将继续存在,只要它们存在任何类型的引用(即使是弱引用之类的东西也是如此;如果对对象的唯一引用是弱引用,系统将使它们无效; 到那时,该对象将不再有任何引用,并且它将不复存在)。

的目的Dispose是将一个可能可用的对象更改为一个对象通过通知所有此类实体不再需要其“服务”,不再有任何外部实体代表其做任何事情。如果那些实体停止执行这些服务,需要外部实体服务的对象通常会变得不可用,但处置的对象变得不可用的事实不是 Dispose 的目的,而只是一个常见的后果

于 2013-10-28T17:38:13.403 回答
0

您的属性a是托管资源。IDisposable 是用于处理非托管代码或资源的接口。

也许您希望该对象被销毁?这与处置不同。

于 2013-10-28T16:50:40.260 回答