`
sakakokiya
  • 浏览: 507209 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何手工释放资源?

阅读更多
.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();
}
}
}
分享到:
评论

相关推荐

    C#基础概念二十五问

    1.静态成员和非静态成员的区别? 2.const 和 static ...20.如何手工释放资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别? 23.explicit 和 implicit 的含义? 24.params 有什么用? 25.什么是反射?

    C#的25个问题(内附代码示例)

    1.静态成员和非静态成员的区别? 2.const 和 static ...20.如何手工释放资源? 21.P/Invoke是什么? 22.StringBuilder 和 String 的区别?23.explicit 和 implicit 的含义? 24.params 有什么用? 25.什么是反射?

    【精品教程】C#基础概念二十五问.doc

    20. 如何手工释放资源? 使用IDisposable接口的Dispose方法手工释放非托管资源,例如文件流、数据库连接等。对于托管资源,垃圾回收器会自动处理。 21. P/Invoke是什么? P/Invoke(Platform Invoke)是.NET ...

    C#基础问题.doc

    20. 如何手工释放资源? 手动释放资源通常通过使用 Dispose() 方法或 finally 块来实现,确保在不再需要时释放非托管资源。 21. P/Invoke 是什么? P/Invoke(Platform Invoke)是 .NET Framework 提供的一种机制...

    C#面试题,C#面试经典题

    20. 如何手工释放资源? 答案:可以使用using语句或手动调用Dispose方法。 21. P/Invoke 是什么? 答案:P/Invoke 是一个平台 invoke 机制,用于调用非托管代码。 22. StringBuilder 和 String 的区别? 答案:...

    C#使用中常见问题整理

    如何手工释放资源? 使用`Dispose()`方法或`using`语句可以手动释放不受托管的资源,确保资源的正确清理。 ### 21. P/Invoke是什么? P/Invoke(Platform Invoke)是一种机制,允许C#调用外部的非托管代码,通常是...

    手工释放linux内存.pdf

    ### 手工释放Linux内存详解 #### 一、引言 在Linux环境下,内存管理是一项重要的任务,尤其在服务器环境中更是如此。随着程序的运行,Linux操作系统会利用空闲内存作为缓存,以提高文件读取效率。然而,这也可能...

    手工释放linux内存_proc sys vm drop_caches

    在Linux操作系统中,物理内存是非常宝贵的资源,操作系统会使用各种手段来优化内存的使用。一个常见的现象是,在Linux系统中频繁操作文件,比如复制、读取或者写入,会导致物理内存很快被占用。当这些操作结束之后,...

    Java学习题答案

    而Lock一定要求程序员手工释放.并且必须在finally从句 中释放,如果没有答出在finally中释放不得分.就如Connection没有在finally中关闭一 样.连最基本的资源释放都做不好,还谈什么多线程编程. 6.EJB规范规定...

    手工优化windows XP系统

    - **关闭不必要的服务**:Windows XP中有很多默认开启的服务,其中有些可能是不必要的,通过服务管理器可以关闭这些服务来释放资源。 - **更新驱动程序**:确保所有硬件驱动都是最新版本,新驱动通常会优化性能和...

    最好的手工杀毒软件-绿色

    总的来说,这款名为“最好的手工杀毒软件-绿色”的程序,结合了高效的手动操作和驱动级保护,通过随机释放机制增强了软件的生存能力,同时保持了轻量级和用户友好的特性。开发者对软件的持续优化和对BUG的修复显示了...

    手工坊创业计划书_商业计划 策划书 经营方案.doc

    我们关注市场需求,尤其针对年轻人和亲子群体,为他们提供一个释放创造力的空间。公司预计在初期投入资金用于场地租赁、设备购置、原材料采购以及市场营销,目标是打造成为当地知名的手工坊品牌,并在稳定运营后实现...

    创业计划书-捏捏乐DIY手工坊——创业计划书

    捏捏乐DIY手工坊的设立源于对现代人压力释放和创意表达需求的洞察。随着生活质量的提高,人们越来越重视精神层面的满足,DIY手工活动作为一种寓教于乐、放松心情的方式,逐渐受到各年龄段人群的喜爱。手工坊提供一个...

    已改 美术手工教学在学前教育中的重要性--论文.zip

    美术手工教学在学前教育中扮演着至关重要的角色,它不仅是儿童早期教育的重要组成...因此,教师和家长都应该重视并积极参与到美术手工教学中,为孩子提供丰富的创作环境和资源,让孩子们在玩乐中学习,在学习中成长。

    Office2007版手工完全卸载工具

    3. **启动项和服务**:Office 2007可能会设置一些开机启动项和服务,手工卸载工具会检查并停止或移除这些启动项,释放系统资源。 4. **依赖库和组件**:Office 2007安装时会添加一些系统组件和库文件,手工卸载工具...

    手工杀死列表中正在运行的程序名称

    当某些程序无响应或者我们需要强制结束它们以便释放资源时,"手工杀死列表中正在运行的程序名称"这一操作就显得尤为必要。这个过程涉及到对系统进程的理解、查找以及终止。 首先,我们需要了解什么是进程。在操作...

    [最新]历史二轮复习:第5讲世界工业文明的序幕:工场手工业时期资本主义的兴起.pdf

    5. 农业革命:农业革命是工业革命之前发生的一系列农业技术改进,提高了农业生产力,释放了劳动力,为工业革命提供了必要的劳动力资源。 6. 工业革命:工场手工业时期为工业革命奠定了基础,工业革命是人类历史上的...

Global site tag (gtag.js) - Google Analytics