如何手工释放资源


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 02 面试题
.net面试题
Dec 22 面试题
某公司的.net工程师面试题笔试题
Nov 22 面试题
HSRP的含义以及如何工作
Sep 10 面试题
介绍一下木马病毒的种类
Jul 26 面试题
internal修饰符起什么作用
Dec 16 面试题
Linux如何命名文件--使用文件名时应注意
Jan 22 面试题
介绍一下Make? 为什么使用make
Jul 31 面试题
如何用JQuery进行表单验证
May 29 面试题
MYSQL支持事务吗
Aug 09 面试题
构造方法和其他方法的区别
Apr 26 面试题
如何从一个文件档案的尾端新增记录
Dec 02 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
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的宝库目录--PEAR
2006/10/09 PHP
php桌面中心(一) 创建数据库
2007/03/11 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
js动态给table添加/删除tr的方法
2013/08/02 Javascript
uploadify在Firefox下丢失session问题的解决方法
2013/08/07 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
VUE开发一个图片轮播的组件示例代码
2017/03/06 Javascript
Linux CentOS系统下安装node.js与express的方法
2017/04/01 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
JS 组件系列之Bootstrap Table的冻结列功能彻底解决高度问题
2017/06/30 Javascript
Node.js+jade抓取博客所有文章生成静态html文件的实例
2017/09/19 Javascript
使用vs code开发Nodejs程序的使用方法
2017/09/21 NodeJs
JavaScript实现短暂提示框功能
2018/04/04 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
jQuery实现鼠标拖动图片功能
2021/03/04 jQuery
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
python实现扫雷小游戏
2020/04/24 Python
keras分类之二分类实例(Cat and dog)
2020/07/09 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
工程部经理岗位职责
2013/12/08 职场文书
教师读书活动总结
2014/05/07 职场文书
公司承诺书范文
2014/05/19 职场文书
应届大专生自荐书
2014/06/16 职场文书
临时租车协议范本
2014/09/23 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
Python OpenCV超详细讲解基本功能
2022/04/02 Python
漫画《尖帽子的魔法工坊》宣布动画化
2022/04/06 日漫
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL
Go gorilla/sessions库安装使用
2022/08/14 Golang