析构函数何时在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 ++析构函数的是IDisposableDispose()方法,通常在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将强制垃圾收集器采取行动。