如何手工释放资源


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

面试题 相关文章推荐
一套PHP的笔试题
May 31 面试题
对于没有初始化的变量的初始值可以作怎样的假定
Oct 12 面试题
说一下mysql, oracle等常见数据库的分页实现方案
Sep 29 面试题
写出SQL四条最基本的数据操作语句(DML)
Dec 12 面试题
在SQL Server中创建数据库主要有那种方式
Sep 10 面试题
Linux如何为某个操作添加别名
Mar 01 面试题
下列程序在32位linux或unix中的结果是什么
Mar 25 面试题
海量信息软件测试笔试题
Aug 08 面试题
Python里面如何实现tuple和list的转换
Jun 13 面试题
什么是方法的重载
Jun 24 面试题
这76道Java面试题及答案,祝你能成功通过面试
Apr 16 面试题
J2EE相关知识面试题
Aug 26 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
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公用函数列表[正则]
2007/02/22 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
PHP实现将base64编码字符串转换成图片示例
2018/06/22 PHP
php中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
Nodejs Stream 数据流使用手册
2016/04/17 NodeJs
jQuery实现简单的手风琴效果
2020/04/17 jQuery
详解微信小程序Radio选中样式切换
2017/07/06 Javascript
js实现鼠标移动到图片产生遮罩效果
2017/10/21 Javascript
详解js模板引擎art template数组渲染的方法
2018/10/09 Javascript
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
[00:58]PWL开团时刻DAY5——十人开雾0换5
2020/11/04 DOTA
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
Python标准库之sqlite3使用实例
2014/11/25 Python
发布你的Python模块详解
2016/09/15 Python
浅析Git版本控制器使用
2017/12/10 Python
mac下pycharm设置python版本的图文教程
2018/06/13 Python
Python3 max()函数基础用法
2019/02/19 Python
基于Python获取照片的GPS位置信息
2020/01/20 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
Python JSON常用编解码方法代码实例
2020/09/05 Python
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
毕业生党员个人总结
2015/02/14 职场文书
职工食堂管理制度
2015/08/06 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
html5实现点击弹出图片功能
2021/07/16 HTML / CSS
js中Object.create实例用法详解
2021/10/05 Javascript
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL
Spring Boot接口定义和全局异常统一处理
2022/04/20 Java/Android