如何手工释放资源


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中如何使用Cookie
Oct 28 面试题
请说出你所知道的线程同步的方法
Apr 19 面试题
说出数据连接池的工作机制是什么?
Apr 19 面试题
介绍java中初始化块的使用
Sep 11 面试题
int *p=NULL和*p= NULL有什么区别
Oct 23 面试题
某IT外企面试题-二分法求方程!看看大家的C++功底
Jul 04 面试题
请解释virtual关键字的含义
Jun 17 面试题
托管代码(Managed Code)和非托管代码(Unmanaged Code)有什么区别
Sep 29 面试题
Linux管理员面试题 Linux admin interview questions
Jul 08 面试题
Java面试题:Java类的Main方法如果是Private将会怎么样
Aug 18 面试题
如何在Shell脚本中使用函数
Sep 06 面试题
J2EE模式面试题
Oct 11 面试题
编写一个类体现构造,公有,私有方法,静态,私有变量
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
PHP4实际应用经验篇(3)
2006/10/09 PHP
php 异常处理实现代码
2009/03/10 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
2010/10/12 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
PHP计算近1年的所有月份
2017/03/13 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
js日历功能对象
2012/01/12 Javascript
iframe跨域通信封装详解
2015/08/11 Javascript
jQuery使用$.ajax进行即时验证实例详解
2015/12/11 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
[45:34]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第一场 12.18
2020/12/19 DOTA
python合并文本文件示例
2014/02/07 Python
关于Python的一些学习总结
2018/05/25 Python
python使用turtle库绘制树
2018/06/25 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
Scrapy框架使用的基本知识
2018/10/21 Python
Python初学者常见错误详解
2019/07/02 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
关于pytorch处理类别不平衡的问题
2019/12/31 Python
python如何快速生成时间戳
2020/07/21 Python
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
德国旅游网站:weg.de
2018/06/03 全球购物
Myprotein台湾官方网站:全球领先的运动营养品牌
2018/12/10 全球购物
正宗的澳大利亚Ugg靴子零售商:UGG Express
2020/04/19 全球购物
汽车检测与维修专业求职信
2013/10/30 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
大学新闻系自荐书
2014/05/31 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
python Polars库的使用简介
2021/04/21 Python
在Python 中将类对象序列化为JSON
2022/04/06 Python