如果你原来使用的是c++,这里首先要注意的是c#的析构函数与c++的不是一回事。c++的析构函数是在释放对象时调用,c#的析构函数只在垃圾回收时被调用。你可以通过下面的小例子得到证实:
using System;
using System.Runtime.InteropServices;
namespace abc
{
class abcrun
{
static void Main(string[] args)
{
abc a=new abc();
other();
}
static void other()
{  Console.ReadLine();}
}
public class abc
{
~abc()
{
MessageBeep(-1);
}
[System.Runtime.InteropServices.DllImport("User32.dll")]
private extern static Boolean MessageBeep(Int32 t);
}
}
    运行这个程序,只有当程序退出时,你才会听到"咚"响,而实例a早就被释放了。为什么,因为程序退出时CLR为该进程中所有的对象调用它们的析构函数(如果有的话)。有4种事件会调用析构函数,这里不一一列举。
    要不要写析构函数的问题,首先要了解的是为什么要析构函数。刚开始我也认为:既然有无用存储单元收集器去回收内存,要个析构函数干什么?(有这个想法就因为脑子里有c++概念中的析构函数,c#析构函数的原理根本就是两回事)。
    需要析构函数的主要原因是:很多的类包装了一些非托管资源,如文件句柄,数据库连接,网络连接等,无用存储单元收集器无法回收这些资源,所以需要在收集器确认某对象是垃圾时,调用它的析构函数去释放这些非托管资源。细心的人可能会发现:object类定义了Finalize方法。这又是为什么?理由很简单:其实它也就是放在那里摆个样子。如果子类没有自己的析构函数,CLR根本就不会理睬基类object那个析构函数。    关于要不要写析构函数,理解这个不是一件简单的事。原则上讲,应该尽量避免写析构函数,原因就很多了,<applied microsoft .net framework programming>一书列举了六个理由(建议买这本书,好书也)。如果确实需要析构函数,那也要了解一些规则,那本书讲得很明了。