建议69:应使用finally避免资源泄漏

除非发生让应用程序中断的异常,否则finally总是会先于return执行。finally的这个语言特性决定了资源释放的最佳位置就是在finally块中;另外,资源释放会随着调用堆栈由下往上执行。下面的代码验证了这一点,先定义一个需要释放的类:

    class ClassShouldDisposeBase : IDisposable
{
string _methodName;
public ClassShouldDisposeBase(string methodName)
{
_methodName = methodName;
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
Console.WriteLine("在方法:" + _methodName + "中被释放!");
} protected virtual void Dispose(bool disposing)
{
if (disposing)
{
//执行基本的清理代码
}
} ~ClassShouldDisposeBase()
{
this.Dispose(false);
}
}

再来模拟一个调用堆栈:

        static void Main(string[] args)
{
Method1();
} static void Method1()
{
ClassShouldDisposeBase c = null;
try
{
c = new ClassShouldDisposeBase("Method1");
Method2();
}
finally
{
c.Dispose();
} } static void Method2()
{
ClassShouldDisposeBase c = null;
try
{
c = new ClassShouldDisposeBase("Method2");
}
finally
{
c.Dispose();
}
}

输出:

在方法:Method2中被释放!
在方法:Method1中被释放!

finally不会因为调用堆栈中存在的异常而被终止,CLR会先执行catch块,然后再执行finally块。如下:

        static void Main(string[] args)
{
Method3();
} static void Method3()
{
ClassShouldDisposeBase c = null;
try
{
c = new ClassShouldDisposeBase("Method3");
Method4();
}
catch
{
Console.WriteLine("在Method3中捕获了异常。");
}
finally
{
c.Dispose();
} } static void Method4()
{
ClassShouldDisposeBase c = null;
try
{
c = new ClassShouldDisposeBase("Method4");
throw new Exception();
}
catch
{
Console.WriteLine("在Method4中捕获了异常。");
throw;
}
finally
{
c.Dispose();
}
}

输出:

在Method4中捕获了异常。
在方法:Method4中被释放!
在Method3中捕获了异常。
在方法:Method3中被释放!

转自:《编写高质量代码改善C#程序的157个建议》陆敏技

最新文章

  1. 如何提高MySQL Limit查询的性能
  2. APP自动化测试中Monkey和 MonkeyRunner
  3. 暑假集训(2)第四弹 ----- 敌兵布阵(hdu1166)
  4. TCP/IP协议原理与应用笔记15:网络连接设备
  5. PartialViewResult用法
  6. Ghost源代码
  7. Spring-----多环境中加载资源配置文件
  8. 批量创建采购订单 BAPI_PO_CREATE1
  9. Linux防火墙该如何设置
  10. python学习:匿名函数
  11. 【一天一道LeetCode】 #3 Longest Substring Without Repeating Characters
  12. MOOS学习笔记2——HelloWorld回调
  13. C#基础知识之Dictionary
  14. hihoCoder #1646 : Rikka with String II(容斥原理)
  15. Codeforces 300C Beautiful Numbers 【组合数】+【逆元】
  16. Html5与Css3知识点拾遗(四)
  17. 观察者模式——Head First
  18. 什么是JIT,写的很好
  19. Vue 项目集合
  20. latex 安装和使用

热门文章

  1. 利用JAVA操作Redis---demo
  2. 0007-一套完整的CRUD_DEMO
  3. SVN 提交、更新、解决冲突等操作步骤
  4. makefile .phony targets
  5. ReportMachine 打印机横向
  6. 使用copy函数输出容器中的内容
  7. Oracle 相关知识点结构图
  8. fastjson集合转字符串
  9. 产品负责人(Product Owner)的主要职责和技能
  10. Python下载与安装