如何手工释放资源


Posted in 面试题 onDecember 15, 2013
.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作。但在以下两种情况需要我们手工进行资源释放:一、由于它无法对非托管资源进行释放,所以我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象;二、你的类在运行是会产生大量实例(象 GIS 中的Geometry),必须自己手工释放这些资源以提高程序的运行效率
最理想的办法是通过实现一个接口显式的提供给客户调用端手工释放对象,System 命名空间内有一个 IDisposable 接口,拿来做这事非常合适,省得我们自己再声明一个接口了
示例:
using System;
using System.Collections.Generic;
using System.Text;
namespace Example20
{
class Program
{
class Class1 : IDisposable
{
//析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法
~Class1()
{
Dispose(false);
}
//通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率
void IDisposable.Dispose()
{
Dispose(true);
}
//将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力
protected virtual void ReleaseUnmanageResources()
{
//Do something…
}
//私有函数用以释放非托管资源
private void Dispose(bool disposing)
{
ReleaseUnmanageResources();
//为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法
//为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法
if (disposing)
{
GC.SuppressFinalize(this);

}

}

}

static void Main(string[] args)

{

//tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧

Class1 tmpObj1 = new Class1();

//tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些

//个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧

//当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率

Class1 tmpObj2 = new Class1();

((IDisposable)tmpObj2).Dispose();

}

}

}

Tags in this post...

面试题 相关文章推荐
一份Java笔试题
Feb 21 面试题
strlen的几种不同实现方法
May 31 面试题
求∏的近似值,直到最后一项的绝对值小于指定的数
Feb 12 面试题
描述内存分配方式以及它们的区别
Oct 15 面试题
将"引用"作为函数参数有哪些特点
Apr 05 面试题
如何查找和删除数据库中的重复数据
Nov 05 面试题
什么情况下你必须要把一个类定义为abstract的
Jan 06 面试题
C#基础面试题
Oct 17 面试题
一些Unix笔试题和面试题
Sep 25 面试题
是否可以从一个static方法内部发出对非static方法的调用?
Aug 18 面试题
请说出以下代码输出什么
Aug 30 面试题
Exception类的常用方法
Jun 16 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
Aug 10 #面试题
P/Invoke是什么
Jul 31 #面试题
C#如何判断当前用户是否输入某个域
Dec 07 #面试题
StringBuilder和String的区别
May 18 #面试题
explicit和implicit的含义
Nov 15 #面试题
C#如何调用Word并打开一个Word文档
May 08 #面试题
C# .NET面试题
Nov 28 #面试题
You might like
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
PHP 自定义错误处理函数的使用详解
2013/05/10 PHP
PHP自定义多进制的方法
2016/11/03 PHP
PHP封装cURL工具类与应用示例
2019/07/01 PHP
PHP 文件写入和读取操作实例详解【必看篇】
2019/11/04 PHP
JQuery与JSon实现的无刷新分页代码
2011/09/13 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
javascript实现滚动效果的数字时钟实例
2016/07/21 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
jQuery UI实现动画效果代码分享
2018/08/19 jQuery
vue通过video.js解决m3u8视频播放格式的方法
2019/07/30 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
python操作mysql中文显示乱码的解决方法
2014/10/11 Python
python插入数据到列表的方法
2015/04/30 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python中subprocess的简单使用示例
2015/07/28 Python
利用python画一颗心的方法示例
2017/01/31 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
Python设计模式之适配器模式原理与用法详解
2019/01/15 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
体育专业求职信
2014/07/16 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
亲属关系公证书样本
2015/01/23 职场文书
收银员岗位职责
2015/02/03 职场文书
人与自然的观后感
2015/06/18 职场文书
工作自我评价范文
2019/03/21 职场文书
高质量“欢迎词”
2019/04/03 职场文书
2019入党申请书范文3篇
2019/08/21 职场文书