[英]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 ++析構函數的是IDisposable
和Dispose()
方法,通常在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.