证明析构函数隐式转换为vitual的finalize方法
来源:互联网 发布:c多线程编程 pdf 编辑:程序博客网 时间:2024/06/02 02:15
我们自己写一个非常简单的类,如下所示:
using System;
usingSystem.Collections.Generic;
using System.Text;
namespaceDestructPractise
{
class TestDestructor
{
static void Main(string[] args)
{
}
~TestDestructor()
{
System.Console.WriteLine("i amdestructor");
}
}
}
我们自己显式的定义析构函数,并在里面加了一句话。
编译为exe文件。
使用Reflector反编译之:
.class private auto ansi beforefieldinit TestDestructor
extends [mscorlib]System.Object
{
.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
.maxstack 8
L_0000: ldarg.0
L_0001: call instance void [mscorlib]System.Object::.ctor()
L_0006: ret
}
.method family hidebysig virtual instance void Finalize() cil managed
{
.maxstack 1
L_0000: nop
L_0001: ldstr "i am destructor"
L_0006: call void [mscorlib]System.Console::WriteLine(string)
L_000b: nop
L_000c: nop
L_000d: leave.s L_0017
L_000f: ldarg.0
L_0010: call instance void [mscorlib]System.Object::Finalize()
L_0015: nop
L_0016: endfinally
L_0017: nop
L_0018: ret
.try L_0000 to L_000ffinally handler L_000f toL_0017
}
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 8
L_0000: nop
L_0001: ret
}
}
从IL语言中可看出来:
1)我们在上面的代码中没有定义构造函数,CLR自动给我们加了一个默认构造函数。
可以看出来实际上是使用object的构造器构造了一个object,然后丢出去了。
2)析构函数确实隐式的转换成了vitual的Finalize()。
在隐式转换成的Finalize()方法中,L_0000到L_000f之间都是处理我们之前写在析构函数中的东西。
注意观察,在L_000f到L_0017之间又调用了它父类,即Object的Finalize()。
所以析构函数等价与:
protected vitual voidFinalize()
{
try
{
//析构函数中原来写的东西
}
finally
{
base.Finalize();
}
}
- 证明析构函数隐式转换为vitual的finalize方法
- vitual析构函数的作用
- 条款 07 为多态基类声明vitual析构函数
- Finalize 方法和析构函数
- finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
- C++ Vitual函数
- 理解finalize()-析构函数的替代者
- 理解finalize()-析构函数的替代者【转载】
- 析构函数、Finalize()和Dispose()的区别
- 析构函数和Finalize()之间的那点事
- Java中的 finalize() 与c++的析构函数 分析
- finalize方法的说明
- finalize方法的使用
- finalize方法的使用
- finalize()方法的使用
- 方法finalize()的应用
- 方法finalize()的应用
- 方法finalize()的应用
- 1000 A + B Problem
- c#中的委托
- C#中的委托数组
- 从oracle读出当前用户的所有表名
- 1001 Sum Problem.
- 证明析构函数隐式转换为vitual的finalize方法
- Struts 2.0的Action讲解
- 1002 A + B Problem II
- 学习JPA——Hibernate Annotation使用实例
- 关于hibernate的缓存使用(hibernate2)
- 1003 Max Sum
- 1004 Let the Balloon Rise
- Struts2中的日期的格式化
- 1005 Number Sequence