计算机内存有限,当变量或对象不在需要内存的时候,必须回收内存。值类型离开作用域就会被销毁,引用类型呢?
…
…
对象生存期
Monkey monkey = new Monkey();
上面的代码中new表面上是单步操作,但实际分两步走:
1.new从堆中分配原始内存,这个阶段无法干预
2.new操作符将原始内存转换成对象,这时必须初始化对象。这个阶段可用构造器控制.
monkey变量离开作用域时,它引用的Monkey对象就没人引用了,所以对象可被销毁,占用的内存可被回收.
和对象创建相似,对象销毁也分两步:
1.CLR执行清理工作,可以写一个析构器来加以控制。
2.CLR将对象占用的内存归还给堆,解除对象内存分配,这个阶段没有控制权.
销毁对象并将内存归还给堆的过程称为垃圾回收.
…
…
编写析构器
使用析构器,可在对象被垃圾回收时执行必要的清理.CLR能自动清理对象使用的任何托管资源,所以许多时候都不需要自己写析构器.但如果托管资源很大,就可以考虑将堆该资源的所有引用设为null,使资源能被理解清理。
另外,如果对象引用了非托管资源,析构器就更有用了.
析构器的语法是先写一个~符号,在添加类名:
注意:
1.析构器只适合引用类型,值类型不能声明析构器
2.不能为析构器指定访问修饰符,因为析构器总是由垃圾回收器帮你调用,你不能自己调用.
3.析构器不能获取任何参数.因为你自己调用不了
编译器内部自动将析构器转换成对Object.Finalize方法的一个重写方法的调用.
class Monkey
{
~Monkey()
{
...
}
}
将会转换成以下形式:
class