CriticalFinalizerObject详解

一、类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类,让其继承CriticalFinalizerObject类,修改后的SubCri类如下:

public class SubCri: CriticalFinalizerObject
{//SubCri继承CriticalFinalizerObject
	~SubCri(){Console.WriteLine(" ~SubCri()");}
}

再次运行main方法,结果如下:
![SubCri类继承了CriticalFinalizerObject时的运行结果在这里插入图片描述
我们可以看到,SubCri类继承了CriticalFinalizerObject之后,它的finalizer在最后才会被调用(与前面的运行结果对比可以发现)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值