经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
利用IDisposable接口构建包含非托管资源对象
来源:cnblogs  作者:帆帆帆  时间:2018/11/13 9:48:32  对本文有异议

托管资源与非托管资源

在.net中,对象使用的资源分为两种:托管资源与非托管资源。托管资源由CLR进行管理,不需要开发人员去人工进行控制,.NET中托管资源主要指“对象在堆中的内存”;非托管资源指对象使用到的一些托管内存之外的内资源(例如操作系统的资源),CLR不会管理这些资源,需要开发人员去控制。.NET对象使用到的非托管资源主要有I/O流、数据库连接、Socket连接、窗口句柄等直接与操作系统操作的相关资源。

管理非托管资源

当一个对象不再使用时,我们应该将它使用的非托管资源释放掉,归还给操作系统,不然等到CLR将它在队中的内存回收之后。这部分内存就会变成不可达状态。只能等到整个应用程序运行结束后才能归还给系统。所以我们应当在该对象实例处于“可达”状态时,既有对象引用指向它时释放非托管资源。

利用IDisposable接口构造含有非托管资源类型的对象

在.net类库中有一个IDisposed的接口。几乎每一个使用非托管资源的类型都应该实现这个接口。那么如果我们看到实现此接口的类型,也应该第一时间想到该类型中包含非托管资源。IDispose接口是管理对象非托管资源的一种原则。代码如下:

  1. interface IDisposable
  2. {
  3. void Dispose();
  4. }
  5. class ABase:IDisposable
  6. {
  7. bool _disposed = false;
  8. public bool Disposed
  9. {
  10. get
  11. {
  12. return _disposed;
  13. }
  14. }
  15. public ABase(){}
  16. public void Dispose()
  17. {
  18. if(_disposed)
  19. {
  20. Dispose(true);
  21. GC.SuppressFinalize(this);
  22. _disposed = true;
  23. }
  24. }
  25. protected virtual void Dispose(bool disposing)
  26. {
  27. if(disposing)
  28. {
  29. //release member's unmanaged resource
  30. }
  31. // release ABase's unmanaged resource
  32. }
  33. ~ABase
  34. {
  35. Dispose(false);
  36. }
  37. }
  38. class A : ABase
  39. {
  40. public A()
  41. {
  42. }
  43. protected override void Dispose(bool disposing)
  44. {
  45. if(disposing)
  46. {
  47. // release member's unmanaged resource
  48. }
  49. // release A's unmanaged resource
  50. // release base class's unmanaged resource
  51. base.Dispose(disposing);
  52. }
  53. }
  54. class B:A
  55. {
  56. public B()
  57. {
  58. }
  59. public void Dosomething()
  60. {
  61. if(Disposed)// if released, throw exception
  62. {
  63. throw new ObjectDisposedException(...);
  64. }
  65. // do something here
  66. }
  67. protected override void Dispose(bool disposing)
  68. {
  69. if(disposing)
  70. {
  71. // release member's unmanaged resource
  72. }
  73. // release B's Unmanaged resource
  74. base.Dispose(disposing);
  75. }
  76. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号