using System; //处理非托管资源 //例如:文件句柄、网络连接、数据库连接 //实现IDisposable不意味着也应该实现一个终结器,终结器会带来额外开销 //发布本机资源,要释放本机资源就需要终结器 //如果实现了终结器,也应该实现IDisposabel接口 //这样本机资源可以早些释放 namespace ConsoleApp { //1.析构函数或终结器 class MyClass { //C#无法确定对象的析构函数何时执行 //会有延迟 //频繁使用析构函数,而且使用它们执行长时间的清理任务,对性能影响就会非常显著 ~MyClass() { //其实是Finalize()方法 } } //2.实现System.IDisposable class MyClass1 : IDisposable { public void Dispose() { } } //3.双重实现 class MyClass2 : IDisposable { //表示对象是否已被清理 private bool _isDisposed = false; public void Dispose() { //... Dispose(true); GC.SuppressFinalize(this);//告诉回收器不需要调用析构函数了 } protected virtual void Dispose(bool disposing) { if (!_isDisposed) { if (disposing) {//... //清理托管资源 } //... //清理非托管 } _isDisposed = true; } ~MyClass2()//只清理非托管 { Dispose(false); } } class Program { static void Main(string[] args) { MyClass1 theInstance = null; //使用try/finally确保发生异常也能释放资源 try { theInstance = new MyClass1(); } finally { theInstance?.Dispose(); } //如果这些大括号过多很容易混淆 //也可以使用using来完成此工作,在变量超出作用域会自动调用Dispose() using (var ins = new MyClass1()) { //... } } } }