如何手工释放资源


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

面试题 相关文章推荐
说说你所熟悉或听说过的j2ee中的几种常用模式?及对设计模式的一些看法
May 24 面试题
得到Class的三个过程是什么
Aug 10 面试题
super关键字的用法
Apr 10 面试题
包装类的功能、种类、常用方法
Jan 27 面试题
用C或者C++语言实现SOCKET通信
Feb 24 面试题
使用索引有什么好处
Jul 27 面试题
了解AppleShare protocol(AppleShare协议)吗
Aug 28 面试题
软件生产职位结构化面试主要考察要素及面试题库
Jun 12 面试题
remote接口和home接口主要作用
May 15 面试题
在浏览器端如何得到服务器端响应的XML数据
Nov 24 面试题
abstract class和interface有什么区别
Aug 04 面试题
送给程序员的20个Java集合面试问题
Aug 06 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
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+Mysql+jQuery实现发布微博程序 jQuery篇
2011/10/08 PHP
一个简单的网页密码登陆php代码
2012/07/17 PHP
深入理解PHP JSON数组与对象
2016/07/19 PHP
php rmdir使用递归函数删除非空目录实例详解
2016/10/20 PHP
用一段js程序来实现动画功能
2007/03/06 Javascript
JavaScript this调用规则说明
2010/03/08 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
js中array的sort()方法使用介绍
2014/02/20 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
浅析Ajax语法
2016/12/05 Javascript
layui分页效果实现代码
2017/05/19 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
详解Python中__str__和__repr__方法的区别
2015/04/17 Python
Python的净值数据接口调用示例分享
2016/03/15 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
基于Django静态资源部署404的解决方法
2019/07/28 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
保加利亚手表、香水、化妆品和珠宝购物网站:Brasty.bg
2020/04/22 全球购物
酒店中秋节促销方案
2014/01/30 职场文书
求职简历的自我评价
2014/01/31 职场文书
迟到检讨书500字
2014/02/05 职场文书
计算机学生的自我评价分享
2014/02/18 职场文书
小学评语大全
2014/04/22 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
雷锋观后感
2015/06/10 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python