一、类CriticalFinalizerObject的定义
public abstract class CriticalFinalizerObject{
protected CriticalFinalizerObject(){ }
[SuppressMessage("Microsoft.Performance", "CA1821:RemoveEmptyFinalizers",
Justification = "Base finalizer method on CriticalFinalizerObject")]
~CriticalFinalizerObject() { }
}
类CriticalFinalizerObject的作用是:使得派生自该类的所有类中定义的终结器(finalizer)都是critical的,即保证所有的finalizer都会被执行,不会被宿主中断,并且派生类中定义的finalizer会在同一时期被垃圾回收器回收的对象的finalizer全部执行完成之后再执行。(最后执行派生自CriticalFinalizerObject类的finalizer)
二、CriticalFinalizerObject作用的测试案例
首先定义了如下三个测试用类,现在Test01、Test02、SubCri三个类都是普通的类
public class SubCri// : CriticalFinalizerObject
{//SubCri还没有继承CriticalFinalizerObject
~SubCri(){Console.WriteLine(" ~SubCri()");}
}
public class Test01{
~Test01() { Console.WriteLine(" ~Test01()"); }
}
public class Test02 {
~Test02() { Console.WriteLine(" ~Test02()"); }
}
然后,我们在一个方法中分别创建上面测试用类的实例各一个,代码如下:
public static void Test() {
Test01 t1 = new Test01();
SubCri subClass = new SubCri();
Test02 t2 = new Test02();
}
接着我们在main方法中调用上面定义的Test()方法,代码如下:
static void Main(string[] args) {
Test();
GC.Collect();
}
Test方法调用结束之后,Test中创建三个对象(t1,subClass,t2)将会被回收,即他们打finalizer会被调用,运行结果如下:
现在我们修改SubCri类,让其继承CriticalFinalizerObject类,修改后的SubCri类如下:
public class SubCri: CriticalFinalizerObject
{//SubCri继承CriticalFinalizerObject
~SubCri(){Console.WriteLine(" ~SubCri()");}
}
再次运行main方法,结果如下:
![SubCri类继承了CriticalFinalizerObject时的运行结果
我们可以看到,SubCri类继承了CriticalFinalizerObject之后,它的finalizer在最后才会被调用(与前面的运行结果对比可以发现)