析构函数何时在ASP.NET中调用C#类?

c00*_*0fd 7 .net c# asp.net destructor

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

public class MyClass
{
    public MyClass()
    {
        //Do the work
    }
    ~MyClass()
    {
        //Destructor
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

//Continue on
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*son 6

等效于C++析构函数IDisposableDispose()方法和方法通常在using块中使用.

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

你称之为析构函数的东西更为人所知Finalizer.

以下是使用IDisposable的方法.请注意,Dispose()不会自动调用; 您可以做的最好的事情是使用using哪个导致Dispose()被调用,即使using块在到达结束之前有异常.

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

    public void Dispose()
    {
        // Clean stuff up.
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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.
}
Run Code Online (Sandbox Code Playgroud)

.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();
}
Run Code Online (Sandbox Code Playgroud)