//这段代码来自官方示例,删除了其中用处不大的细节using System;
using System.ComponentModel;/**** 这个模式搞的这么复杂,目的是:不管使用者有没有手动调用Dipose函数,都能保证托管资源被正确释放,但非托管资源不管,因为非托管资源只能由用户保证* 1,若用户手动调用Dispose(),则Dipose(true)被调用,托管与非托管一起释放了,同时告诉GC不要再执行析构函数* 2,若用户没有手动调用Dispose()函数,则析构函数最终会被执行,其中调用了Dipose(false),保证托管资源被释放*/
public class ConsoleMonitor : IDisposable
{private bool disposed = false;public ConsoleMonitor(){Console.WriteLine("The ConsoleMonitor class constructor.\n");}// The destructor calls Object.Finalize.~ConsoleMonitor(){Console.WriteLine("The ConsoleMonitor finalizer.\n");// Call Dispose with disposing = false.Dispose(false);}public void Write(){Console.WriteLine("The Write method.\n");}/**** 不要写这个方法,会报错,因为它有BUG,很容易出错,官方推荐方式是用析构函数来替代此方法* 原理上来说,此方法是继承了IDispose的类在析构时会被调用的,它最初的设计目的等同于析构函数*///void Finalize()//{//}//给外部手动调用的,方法名可以任意public void Dispose(){Console.WriteLine("TThe Dispose method.\n");Dispose(true);//告诉GC管理器,当GC执行时不要再调用此对象的析构函数(其中有Dispose(false)),因为我们自己已在Dispose(true)中已进行了dipose(false)的操作GC.SuppressFinalize(this); }/***给析构函数(或finalize)调用的,函数签名必须这样* 注意finalize已废弃,见如上说明* disposing:当我们自己调用时传true,当系统调用时为false* true和false主要为了区别销毁托管资源与非托管资源*/private void Dispose(bool disposing){Console.WriteLine("The Dispose({0}) method.\n");// Execute if resources have not already been disposed.if (!disposed){// If the call is from Dispose, free managed resources.if (disposing){Console.Error.WriteLine("Disposing of managed resources.");}// Free unmanaged resources.Console.WriteLine("Disposing of unmanaged resources.");}disposed = true;}
}public class Example
{public static void Main(){Console.WriteLine("ConsoleMonitor instance....");ConsoleMonitor monitor = new ConsoleMonitor();monitor.Write();monitor.Dispose();}
}
// If the monitor.Dispose method is not called, the example displays the following output:
//       ConsoleMonitor instance....
//       The ConsoleMonitor class constructor.
//       The Write method.
//       The ConsoleMonitor finalizer.
//       The Dispose(False) method.
//       Disposing of unmanaged resources.
//
// If the monitor.Dispose method is called, the example displays the following output:
//       ConsoleMonitor instance....
//       The ConsoleMonitor class constructor.
//       The Write method.
//       The Dispose method.
//       The Dispose(True) method.
//       Disposing of managed resources.
//       Disposing of unmanaged resources.

具体理论参考官方解析:

Implementing a Dispose method

有关Dispose,Finalize,GC.SupressFinalize函数-托管与非托管资源释放的模式相关推荐

  1. C++/CLI 托管C++的托管与非托管字符串的相互转换【1】

    Git 源码地址 C++/CLI 托管C++的托管与非托管字符串的相互转换[1] C++/CLI 托管C++的数据类型介绍[2] C++/CLI 托管C++的基本数据类型及函数[3] C++/CLI ...

  2. .net中的托管、非托管

    1.托管代码Managed Code 托管代码是编译器创建,被编译成中间语言(IL),IL被保存在程序集(描述代码的类.方法它和属性的元数据文件)中. 托管代码运行在CLR中: 托管代码独立于平台和语 ...

  3. 托管和非托管的区别。

    NET Framework 是一种新的计算平台,它简化了在高度分布式 Internet 环境中的应用程序开发..NET Framework 旨在实现下列目标: 提供一个一致的面向对象的编程环境,而无论 ...

  4. 托管和非托管_技术和托管新闻综述

    托管和非托管 Welcome to our latest round-up of news from the technology and hosting world. Here's what we' ...

  5. 托管与非托管的混合编程问题

    (急,先放技术区几天再移动) 写C#应用,需要MDI界面,其中一个子窗体是使用浏览器界面的,单独调试都好好的,使用到MDI中就出问题了,不能打开连接,显示忙信息,没有其他任何响应信息. 现在想通过使用 ...

  6. 浅析托管与非托管C++代码(转)

    随着Visual Studio .NET 2003在四月24号的发布,许多开发者开始考虑使用一项被成为托管代码的新技术.但是对于C++开发者来说,可以会遇到一些麻烦.因为C++是比较特殊的. 什么是托 ...

  7. 浅析托管与非托管C++代码

    随着Visual Studio .NET 2003在四月24号的发布,许多开发者开始考虑使用一项被成为托管 代码 的新技术.但是对于C++开发者来说,可以会 遇到一些麻烦.因为C++是比较特殊的. 什 ...

  8. 超详细解析托管与非托管

    1      DLLImport的使用 using System; using System.Runtime.InteropServices; //命名空间 class Example { //用Dl ...

  9. 斗地主你什么时候才会托管?(.NET中的托管于非托管)

    文章部分引自<.NET4.0面向对象编程漫谈(基础篇)>第1章.NET面向对象编程基础(作者:金旭亮) 无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用"提 ...

最新文章

  1. python程序设计报告-20183122 实验一《Python程序设计》实验报告
  2. 英语关于计算机的作文600字,有关电脑的作文600字
  3. mysql中如何删除表中int约束,MySQL中的约束,添加约束,删除约束,以及其他修饰
  4. LeetCode(#118)————杨辉三角形
  5. 电子政务发展现状的调研分析(转)
  6. MSM8937平台bootloader调试之一
  7. 微信小程序怎么做店铺_微信小程序如何开通店铺
  8. 年底互联网寒冬,裁员直线上升
  9. oracle用户删除了可以恢复吗,oracle_oracle误删数据恢复方法小结,如果用户误删/更新了数据后, - phpStudy...
  10. Java double 保留一个小数、理解BigDecimal、Java解决精度问题
  11. 黑科技!无需代码快速搭建网站的平台来了
  12. 【0031】SQL查询--简单查询--投影运算
  13. 聚焦2019世界人工智能大会:看马斯克、马云“唇枪舌战”,谁更胜一筹?
  14. 探讨一下如何防止撞库。
  15. 机器人开发--伺服电机介绍
  16. uefi引导gpt安装win10_【UEFI+GPT amp; Legacy+MBR】如何安装系统
  17. 网传稚晖君从华为离职创业,或投身机器人领域
  18. 【斩获7枚offer,入职阿里平台事业部】横扫阿里、美团、京东、之后,我写下了这篇面经!
  19. C语言学习中遇到的小知识点
  20. Pygame 教程(1):创建第一个应用程序

热门文章

  1. 笔记-信息化与系统集成技术-供应链的特征
  2. 《系统集成项目管理工程师》必背100个知识点-02项目组织方式和特点
  3. 笔记-信息系统开发基础-软件测试-软件测试的类型
  4. 信息系统项目管理师-常用技术标准考点笔记
  5. C#中面向对象初使用-实现问好窗体程序
  6. MyBatisPlus查询方法selectById、selectOne、selectBatchIds、selectByMap、selectPage的使用
  7. DOS介绍以及常用命令
  8. ElementUI的DateTimePicker组件添加验证规则以及限制选择范围
  9. java命令可以但是javac命令找不到
  10. 2 Redis基本知识