如何手工释放资源


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

面试题 相关文章推荐
static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
Feb 22 面试题
什么是唯一索引
Jul 05 面试题
西安启天科技有限公司网络工程师面试题笔试题
Jun 12 面试题
维德科技C#面试题笔试题
Dec 09 面试题
C#中的验证控件有几种
Mar 08 面试题
linux面试题参考答案(4)
Jan 28 面试题
网上常见的一份Linux面试题(多项选择部分)
Sep 09 面试题
GWT的应用有哪两种部署模式
Dec 21 面试题
Java中各种基本数据类型的默认值都是什么
Dec 22 面试题
Java软件工程师综合面试题笔试题
Sep 08 面试题
Java面试题冲刺第十五天--设计模式
Aug 07 面试题
Java面试题冲刺第十七天--基础篇3
Aug 07 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
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 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
2013/11/07 PHP
Symfony页面的基本创建实例详解
2015/01/26 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
CodeIgniter基于Email类发邮件的方法
2016/03/29 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
Javascript 继承实现例子
2009/08/12 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
运行Node.js的IIS扩展iisnode安装配置笔记
2015/03/02 Javascript
js使用cookie记录用户名的方法
2015/11/26 Javascript
Javascript 实现微信分享(QQ、朋友圈、分享给朋友)
2016/10/21 Javascript
jQuery图片轮播实现并封装(一)
2016/12/03 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
详解JavaScript中的六种错误类型
2017/09/21 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
新手快速上手webpack4打包工具的使用详解
2019/01/28 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
2019/09/23 Javascript
[50:22]完美盛典-2018年度红毯走秀
2018/12/16 DOTA
python生成指定尺寸缩略图的示例
2014/05/07 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
python openpyxl使用方法详解
2019/07/18 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
Python networkx包的实现
2020/02/14 Python
Python 随机按键模拟2小时
2020/12/30 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
投资意向书范本
2014/04/01 职场文书
俞敏洪励志演讲稿
2014/04/29 职场文书
党的群众路线教育实践活动对照检查材料(教师)
2014/09/24 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
《曾国藩家书》读后感——读家书,立家风
2019/08/21 职场文书
MySQL之DML语言
2021/04/05 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL