如何手工释放资源


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

面试题 相关文章推荐
几个人围成一圈的问题
Sep 26 面试题
如何在Cookie里面保存Unicode和国际化字符
May 25 面试题
Java方面的关于数组和继承的笔面试题
Sep 18 面试题
请写出 float x 与"零值"比较的 if 语句
Jan 04 面试题
Android interview questions
Dec 25 面试题
数据库面试要点基本概念
Oct 31 面试题
试述DBMS的主要功能
Nov 13 面试题
如何删除一个表里面的重复行
Jul 13 面试题
酷瑞网络科技面试题
Mar 30 面试题
ShellScript面试题一则-ShellScript编程
Mar 05 面试题
港湾网络笔试题
Apr 19 面试题
类的返射机制中的包及核心类
Sep 12 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
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工厂模式的好处
2013/06/18 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
PHP添加PNG图片背景透明水印操作类定义与用法示例
2019/03/12 PHP
JavaScript修改css样式style
2008/04/15 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
js查看一个函数的执行时间实例代码
2015/09/12 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
JavaScript读二进制文件并用ajax传输二进制流的方法
2016/07/18 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
JS表单验证方法实例小结【电话、身份证号、Email、中文、特殊字符、身份证号等】
2017/02/14 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
vue.js实现的绑定class操作示例
2018/07/06 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
JavaScript闭包与作用域链实例分析
2019/01/21 Javascript
js作用域和作用域链及预解析
2019/04/11 Javascript
layui table 多行删除(id获取)的方法
2019/09/12 Javascript
对vuex中store和$store的区别说明
2020/07/24 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
深入理解Python中的*重复运算符
2017/10/28 Python
Python File readlines() 使用方法
2018/03/19 Python
手写一个python迭代器过程详解
2019/08/27 Python
django-orm F对象的使用 按照两个字段的和,乘积排序实例
2020/05/18 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
机械工程师求职自我评价
2013/09/23 职场文书
股权转让协议书
2014/04/12 职场文书
爱国演讲稿400字
2014/05/07 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android