如何手工释放资源


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

面试题 相关文章推荐
List, Set, Map是否继承自Collection接口?
May 16 面试题
extern在函数声明中是什么意思
Jan 19 面试题
存储过程和函数的区别
May 28 面试题
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
Dec 03 面试题
C#中类(class)与结构(struct)的异同
Nov 03 面试题
通用C#笔试题附答案
Nov 26 面试题
Linux如何为某个操作添加别名
Mar 01 面试题
Linux机考试题
Jul 17 面试题
Linux内核的同步机制是什么?主要有哪几种内核锁
Jul 11 面试题
解释i节点在文件系统中的作用
Nov 26 面试题
信号量和自旋锁的区别?如何选择使用?
Sep 08 面试题
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
IE与Firefox在JavaScript上的7个不同写法小结
2009/09/14 Javascript
jquery prop的使用介绍及与attr的区别
2013/12/19 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
jQuery 选择符详细介绍及整理
2016/12/02 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
2017/04/22 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
纯JavaScript实现实时反馈系统时间
2017/10/26 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
使用Vue-cli 3.0搭建Vue项目的方法
2018/06/07 Javascript
Vue开发之watch监听数组、对象、变量操作分析
2019/04/25 Javascript
vuex入门最详细整理
2020/03/04 Javascript
Vue项目移动端滚动穿透问题的实现
2020/05/19 Javascript
[49:29]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python线程池的实现实例
2013/11/18 Python
Python中存取文件的4种不同操作
2018/07/02 Python
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
解决Windows下python和pip命令无法使用的问题
2020/08/31 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
使用CSS3实现input多选框自定义样式的方法示例
2019/07/19 HTML / CSS
CSS3+HTML5+JS 实现一个块的收缩与展开动画效果
2020/11/17 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
Spartoo芬兰:欧洲最大的网上鞋店
2016/08/28 全球购物
考博自荐信
2013/10/25 职场文书
人力资源经理自我评价
2014/01/04 职场文书
宣传口号大全
2014/06/16 职场文书
银行授权委托书样本
2014/10/13 职场文书
家访教师心得体会
2016/01/23 职场文书
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python
css样式important规则的正确使用方式
2022/06/10 HTML / CSS