C基礎知识梳理系列十二终结操作及资源清理.docVIP

  • 4
  • 0
  • 约8千字
  • 约 9页
  • 2016-12-06 发布于重庆
  • 举报

C基礎知识梳理系列十二终结操作及资源清理.doc

C基礎知识梳理系列十二终结操作及资源清理

摘 要 经过上一章的讨论,我们知道,CLR会在必要的时候启动垃圾回收器对不再使用的对象所占的内存进行回收,其实,在一个对象被回收前我们还可以通过析构函数来实现终结操作释放资源,了解终结操作后,我们还可以使用Dispose模式进行手工强制清理资源。这一章我们将讨论这些相关话题。 第一节 析构函数和Finalize方法 C#与C++有着类似的析构函数,都是对资源进行清理,但是,在C++中,开发人员明确知道析构函数会被调用,而C#中,开发人员不太明确析构函数会在什么时候被调用,它是由CLR管理的,通常是在一个对象被标记为垃圾对象,如果有析构函数,CLR的垃圾回收器会先调用析构函数,然后再回收其内存。 类型System.Object有一个受保护的虚方法protected virtual void Finalize();这个就是“析构函数”。如果想为一个类型添加析构函数,必须使用与C++类型的语法结构:前置波浪线+类名,相当于无参构造函数的名前加上波浪线,如下: public class Code_12 : IApp { public void DoWork() { } ~Code_12() { Console.WriteLine(Clear Code_12); } } 析构函数前不能有任何访问修饰符,并且一个类型只能有一个析构函数。编译后,上面的~Code_12()被编译成名为Finalize的方法 可以看到,编译过程实际上是对基类Object的虚方法Finalize()的重写,可以非常强悍地认为Finalize就是析构函数~Code_12()的别名, 二者只是书写方式不同,干的都是一样的擦屁股的活。我们再来看一下它的内部IL: .method family hidebysig virtual instance void Finalize() cil managed { // 代码大小 25 (0x19) .maxstack 1 .try { IL_0000: nop IL_0001: ldstr Clear Code_12 IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: nop IL_000d: leave.s IL_0017 } // end .try finally { IL_000f: ldarg.0 IL_0010: call instance void [mscorlib]System.Object::Finalize() IL_0015: nop IL_0016: endfinally } // end handler IL_0017: nop IL_0018: ret } // end of method Code_12::Finalize 可以看到,Finalize()方法内实际上是将代码包装到try…finally块内,我们实现的代码被放到了try块,在finally块内调用了基类的Finalize方法,相当于base.Finalize()。 前面我们说过, 析构函数是在垃圾回收器回收垃圾对象之前的最后才执行一些清理工作,它的执行是受CLR管理,非人工可控,我们通过一个示例代码来看一下它的执行顺序: public class Code_12_01 { public Code_12_01() { Console.WriteLine(Create Code_12_01); } ~Code_12_01() { Console.WriteLine(Clear Code_12_01); } } public class Code_12_02 : Code_12_01 { public Code_12_02() { Console.WriteLine(Create Code_12_02); } ~Code_12_02() {

文档评论(0)

1亿VIP精品文档

相关文档