簡體   English   中英

析構函數何時在ASP.NET中調用C#類?

[英]When is destructor called for C# classes in ASP.NET?

說,我有自己定義的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范圍的末尾調用析構函數,但它永遠不會被調用。 我錯過了什么?

等效於C ++析構函數的是IDisposableDispose()方法,通常在using塊中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.
    }
}

然后你可以像這樣使用它:

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();
}

你無法控制時間或猜測何時會調用對象的實際析構函數。 這完全取決於Garbage Collector

在這種情況下,唯一的想法是,您可以確定,當您離開該范圍時,對象c變得無法訪問(我假設在范圍內沒有對該實例的全局引用),因此實例c 旨在被識別並在時間到來時被Garbage Collector刪除。

關於何時釋放對象,由垃圾收集器決定。 但是,您可以通過調用Finalize來強制釋放對象。 GC.Collect將強制垃圾收集器采取行動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM