如何手工释放资源


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中compareTo和compare的区别
Apr 12 面试题
在C中是否有模拟继承等面向对象程序设计特性的好方法
May 22 面试题
c/c++某大公司的两道笔试题
Feb 02 面试题
一个C/C++编程面试题
Nov 10 面试题
.NET面试10题
Feb 24 面试题
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
Jun 05 面试题
在weblogic中发布ejb需涉及到哪些配置文件
Jan 17 面试题
什么是GWT的Module
Jan 20 面试题
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
Jan 27 面试题
Java模拟试题
Nov 10 面试题
当文件系统受到破坏时,如何检查和修复系统?
Mar 09 面试题
Java面试题冲刺第十八天--Spring框架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、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
2017/02/04 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
文本框的字数限制功能jquery插件
2009/11/24 Javascript
jquery ready(fn)事件使用介绍
2013/08/21 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
JavaScript极简入门教程(三):数组
2014/10/25 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
常用js,css文件统一加载方法(推荐) 并在加载之后调用回调函数
2016/09/23 Javascript
详解angularjs中的隔离作用域理解以及绑定策略
2017/05/31 Javascript
mongoose设置unique不生效问题的解决及如何移除unique的限制
2017/11/07 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
layui动态加载多表头的实例
2019/09/05 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
JavaScript setInterval()与setTimeout()计时器
2019/12/27 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
python PyTorch参数初始化和Finetune
2018/02/11 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
Python XlsxWriter模块Chart类用法实例分析
2019/03/11 Python
python中update的基本使用方法详解
2019/07/17 Python
Series和DataFrame使用简单入门
2019/11/13 Python
如何用tempfile库创建python进程中的临时文件
2021/01/28 Python
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
理工大学毕业生自荐信
2013/11/01 职场文书
《月迹》教学反思
2014/02/19 职场文书
2014年乡镇纪委工作总结
2014/12/19 职场文书
2015中秋祝酒词
2015/08/12 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server
Python学习之包与模块详解
2022/03/19 Python