- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C#基础知识梳理系列十二:终结操作及资源清理.doc
摘 要
经过上一章的讨论,我们知道,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()
{
Console.W
原创力文档


文档评论(0)