有关Dispose,Finalize,GC.SupressFinalize函数-托管与非托管资源释放的模式
//这段代码来自官方示例,删除了其中用处不大的细节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函数-托管与非托管资源释放的模式相关推荐
- C++/CLI 托管C++的托管与非托管字符串的相互转换【1】
Git 源码地址 C++/CLI 托管C++的托管与非托管字符串的相互转换[1] C++/CLI 托管C++的数据类型介绍[2] C++/CLI 托管C++的基本数据类型及函数[3] C++/CLI ...
- .net中的托管、非托管
1.托管代码Managed Code 托管代码是编译器创建,被编译成中间语言(IL),IL被保存在程序集(描述代码的类.方法它和属性的元数据文件)中. 托管代码运行在CLR中: 托管代码独立于平台和语 ...
- 托管和非托管的区别。
NET Framework 是一种新的计算平台,它简化了在高度分布式 Internet 环境中的应用程序开发..NET Framework 旨在实现下列目标: 提供一个一致的面向对象的编程环境,而无论 ...
- 托管和非托管_技术和托管新闻综述
托管和非托管 Welcome to our latest round-up of news from the technology and hosting world. Here's what we' ...
- 托管与非托管的混合编程问题
(急,先放技术区几天再移动) 写C#应用,需要MDI界面,其中一个子窗体是使用浏览器界面的,单独调试都好好的,使用到MDI中就出问题了,不能打开连接,显示忙信息,没有其他任何响应信息. 现在想通过使用 ...
- 浅析托管与非托管C++代码(转)
随着Visual Studio .NET 2003在四月24号的发布,许多开发者开始考虑使用一项被成为托管代码的新技术.但是对于C++开发者来说,可以会遇到一些麻烦.因为C++是比较特殊的. 什么是托 ...
- 浅析托管与非托管C++代码
随着Visual Studio .NET 2003在四月24号的发布,许多开发者开始考虑使用一项被成为托管 代码 的新技术.但是对于C++开发者来说,可以会 遇到一些麻烦.因为C++是比较特殊的. 什 ...
- 超详细解析托管与非托管
1 DLLImport的使用 using System; using System.Runtime.InteropServices; //命名空间 class Example { //用Dl ...
- 斗地主你什么时候才会托管?(.NET中的托管于非托管)
文章部分引自<.NET4.0面向对象编程漫谈(基础篇)>第1章.NET面向对象编程基础(作者:金旭亮) 无意间看到一位四五岁左右小朋友在玩斗地主,总开始到结束,她一直都在使用"提 ...
最新文章
- python程序设计报告-20183122 实验一《Python程序设计》实验报告
- 英语关于计算机的作文600字,有关电脑的作文600字
- mysql中如何删除表中int约束,MySQL中的约束,添加约束,删除约束,以及其他修饰
- LeetCode(#118)————杨辉三角形
- 电子政务发展现状的调研分析(转)
- MSM8937平台bootloader调试之一
- 微信小程序怎么做店铺_微信小程序如何开通店铺
- 年底互联网寒冬,裁员直线上升
- oracle用户删除了可以恢复吗,oracle_oracle误删数据恢复方法小结,如果用户误删/更新了数据后, - phpStudy...
- Java double 保留一个小数、理解BigDecimal、Java解决精度问题
- 黑科技!无需代码快速搭建网站的平台来了
- 【0031】SQL查询--简单查询--投影运算
- 聚焦2019世界人工智能大会:看马斯克、马云“唇枪舌战”,谁更胜一筹?
- 探讨一下如何防止撞库。
- 机器人开发--伺服电机介绍
- uefi引导gpt安装win10_【UEFI+GPT amp; Legacy+MBR】如何安装系统
- 网传稚晖君从华为离职创业,或投身机器人领域
- 【斩获7枚offer,入职阿里平台事业部】横扫阿里、美团、京东、之后,我写下了这篇面经!
- C语言学习中遇到的小知识点
- Pygame 教程(1):创建第一个应用程序