9

说,我有自己的 C# 类定义如下:

public class MyClass
{
    public MyClass()
    {
        //Do the work
    }
    ~MyClass()
    {
        //Destructor
    }
}

然后我从一个 ASP.NET 项目创建我的类的一个实例,如下所示:

if(true)
{
    MyClass c = new MyClass();
    //Do some work with 'c'

    //Shouldn't destructor for 'c' be called here?
}

//Continue on

我希望在if作用域的末尾调用析构函数,但它永远不会被调用。我错过了什么?

4

3 回答 3

8

等价于 C++ 的析构函数是IDisposableDispose()方法,通常在using块中使用。

请参阅http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

您所说的析构函数更好地称为Finalizer.

下面介绍如何使用 IDisposable。注意Dispose()不是自动调用的;您可以做的最好的事情是使用usingwhich导致Dispose()被调用,即使在using块到达末尾之前存在异常也是如此。

public class MyClass: IDisposable
{
    public MyClass()
    {
        //Do the work
    }

    public void Dispose()
    {
        // Clean stuff up.
    }
}

然后你可以像这样使用它:

using (MyClass c = new MyClass())
{
    // Do some work with 'C'
    // Even if there is an exception, c.Dispose() will be called before
    // the 'using' block is exited.
}

.Dispose()如果需要,您可以自己显式调用。唯一的一点是在执行因任何原因离开块时using自动调用。.Dispose()using

请参阅此处了解更多信息:http: //msdn.microsoft.com/en-us/library/yh598w02%28v=vs.110%29.aspx

基本上,using上面的块相当于:

MyClass c = new MyClass();

try
{
    // Do some work with 'C'
}

finally
{
    if (c != null)
        ((IDisposable)c).Dispose();
}
于 2013-06-24T08:03:25.083 回答
4

您无法控制时间或猜测何时实际调用对象的析构函数。这完全取决于Garbage Collector.

在这种情况下,唯一可以确定的是,在您离开该范围时,该对象c变得无法访问(我假设该范围内没有对该实例的全局引用),因此该实例旨在c被识别和删除到时候。Garbage Collector

于 2013-06-24T07:42:40.787 回答
2

何时释放对象取决于垃圾收集器。但是,您可以通过调用Finalize来强制释放对象。或GC.Collect将强制垃圾收集器采取行动。

于 2013-06-24T07:43:03.643 回答