析构函数何时在ASP.NET中调用C#类?
说,我有自己的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()
; 你可以做的最好的事情是使用use 会导致调用Dispose()
,即使在using
块到达结尾之前有exception。
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()
。 唯一的.Dispose()
是当执行因任何原因离开using
块时自动调用.Dispose()
。
有关详细信息,请参阅此处: 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将强制垃圾收集器采取行动。