返回首页


猜猜以下程序的输出:

class SomeClass : IDisposable

{

   public SomeClass()

   {

      Trace.WriteLine("SomeClass - Attempting instance creation");

      throw new Exception("Ohh !!! Not Now");

   }

 

   public void Dispose()

   {

      Trace.WriteLine("SomeClass::Dispose");

   }

 

    SomeClass()

   {

      Trace.WriteLine("SomeClass::Finalizer");

   }

}



int Main(string args[]){

try{

SomeClass sc = new SomeClass();

}catch(Exception ex){

Trace.WriteLine("Main - {0}", ex.Message);

}

}

这将是该程序的输出:{C}
如果你输出的最后一行惊讶,这将是我们讨论的目的。在网[管理]世界,垃圾收集器负责内存管理 - 完全分配和释放。在C#中,创建类的一个实例是使用新的关键字。要求当创建一个实例,实例的第一个内存分配调用[适当的]类的构造。
为了解释这一令人惊讶的输出,构造函数被调用后的内存分配是由GC。当构造函数抛出异常,对象或资源创建中断,但该内存不能立即被释放以来,GC是完全负责任的内存释放。 GC如下分配的内存块分配的或收回一个复杂和不确定性的风格。终结方法是托管对象回收内存之前的最后一次通话。因此,在上述情况下,被称为终结前回收SomeClass的实例分配的内存。
上述行为是非常不同的创建实例时抛出一个异常] [中断,分配的内存被释放和回收的瞬间从非托管C的。在这种情况下,也析构函数不叫。
PS:一个更详细的非确定性破坏后的思考。

回答

评论会员:a 时间:2