如何手工释放资源


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...

面试题 相关文章推荐
Web Service面试题:如何搭建Axis2的开发环境
Jun 20 面试题
Java中实现多态的机制
Aug 09 面试题
C语言面试题
May 19 面试题
武汉高蓝德国际.net机试
Jun 24 面试题
系统管理员的职责包括那些?管理的对象是什么?
Sep 20 面试题
Why do we need Unit test
Jan 03 面试题
一道输出判断型Java面试题
Oct 01 面试题
int和Integer有什么区别
May 25 面试题
请说出这段代码执行后a和b的值分别是多少
Mar 28 面试题
方正Java笔试题
Jul 03 面试题
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Jul 27 面试题
一套英文Java笔试题面试题
Apr 21 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
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
PHP HTML代码串 截取实现代码
2009/06/29 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
告诉大家什么是JSON
2008/06/10 Javascript
关于JavaScript的一些看法
2009/05/27 Javascript
JavaScript 事件记录使用说明
2009/10/20 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
JavaScript函数参数使用带参数名的方式赋值传入的方法
2015/03/19 Javascript
JavaScript中的原始值和复杂值
2016/01/07 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
React.js入门实例教程之创建hello world 的5种方式
2016/05/11 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
js new Date()实例测试
2019/10/31 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
Mac下Supervisor进程监控管理工具的安装与配置
2014/12/16 Python
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
python实现可将字符转换成大写的tcp服务器实例
2015/04/29 Python
python使用opencv进行人脸识别
2017/04/07 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
2018/03/05 Python
numpy返回array中元素的index方法
2018/06/27 Python
python list转矩阵的实例讲解
2018/08/04 Python
Python3 log10()函数简单用法
2019/02/19 Python
pandas如何处理缺失值
2019/07/31 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
中职生自我鉴定范文
2013/10/03 职场文书
四年的个人工作自我评价
2013/12/10 职场文书
给女儿的表扬信
2014/01/18 职场文书
销售业务员岗位职责
2014/01/29 职场文书
信息服务专业毕业生求职信
2014/03/02 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
正科级干部考察材料
2014/05/29 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书