如何手工释放资源


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工程师面试经历
Dec 09 面试题
String和StringBuffer的区别
Aug 13 面试题
查询优化的一般准则有哪些
Mar 08 面试题
存储过程和sql语句的优缺点
Jul 02 面试题
.NET概念性的面试题
Feb 29 面试题
XML文档面试题
Aug 05 面试题
Linux如何命名文件--使用文件名时应注意
Jan 22 面试题
50道外企软件测试面试题
Aug 18 面试题
中间件分为哪几类
Mar 14 面试题
信号量和自旋锁的区别?如何选择使用?
Sep 08 面试题
Servlet方面面试题
Sep 28 面试题
J2EE中的容器都包括哪些
Aug 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
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
php注销代码(session注销)
2012/05/31 PHP
浅谈json_encode用法
2015/03/05 PHP
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
jquery 卷帘效果实现代码(不同方向)
2013/02/05 Javascript
JavaScript比较两个对象是否相等的方法
2015/02/06 Javascript
基于jquery实现全屏滚动效果
2015/11/26 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
Vue.js动态添加、删除选题的实例代码
2016/09/30 Javascript
Javascript动画效果(1)
2016/10/11 Javascript
JS自定义函数对web前端上传的文件进行类型大小判断
2016/10/19 Javascript
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
JavaScript原型继承_动力节点Java学院整理
2017/06/30 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
vue js秒转天数小时分钟秒的实例代码
2018/08/08 Javascript
原生JS使用Canvas实现拖拽式绘图功能
2019/06/05 Javascript
vue.js实现双击放大预览功能
2020/06/23 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
详解Python 模拟实现生产者消费者模式的实例
2017/08/10 Python
Python数据结构与算法之字典树实现方法示例
2017/12/13 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
keras实现基于孪生网络的图片相似度计算方式
2020/06/11 Python
Smilodox官方运动服装店:从运动服到健身配件
2020/08/27 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
实习生自我鉴定范文
2013/12/05 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
法制宣传月活动总结
2014/04/29 职场文书
歌剧魅影观后感
2015/06/05 职场文书
同意落户证明
2015/06/19 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书