C# 中的Dispose()用法

Dispose()

   在向大家详细介绍C#调用Dispose()方法之前,首先让大家了解下Dispose()方法,然后全面介绍C#调用Dispose()方法。

我们已经知道了处置那些占用非受控(unmanaged)资源的对象的重要性,现在应该编写资源管理代码来处置那些包含非内存资源的类型了。整个.NET 框架组件都使用一个标准的模式来处理非内存资源。使用你建立的类型的用户也希望你遵循这个标准的模式。标准的处理模式的思想是这样的:当客户端记得的时候使用IDisposable接口释放你的非受控资源,当客户端忘记的时候防护性地使用终结器(finalizer)。它与垃圾收集器(Garbage Collector)一起工作,确保只在必要的时候该对象才受到与终结器相关的性能影响。这是处理非受控资源的一条很好的途径,因此我们应该彻底地认识它。

类层次体系中的根基类(root base class)必须实现IDisposable接口以释放资源。这个类型还必须添加一个作为防御机制的终结器。所有这些程序都把释放资源的工作委托给一个虚拟的方法,衍生的类可以根据自己的资源管理需求来重载该方法。只要衍生的类必须释放自己的资源,并且它必须调用该函数的基类版本的时候,它才需要重载这个虚拟方法。

开始的时候,如果你的类使用了非内存资源,它就必须含有一个终结器。你不能依赖客户端总是C#调用Dispose()方法。因为当它们忘记这样做的时候,你就面临资源泄漏的问题。没有调用Dispose是它们的问题,但是你却有过失。用于保证非内存资源被正确地释放的唯一途径是建立终结器。

当垃圾收集器运行的时候,它立即从内存中删除所有不带终结器的垃圾对象。所有带有终结器的对象仍然存在于内存中。这些对象都被添加到终结队列,垃圾收集器引发一个新线程,周期性地在这些对象上运行终结器。在这些终结程序线程完成自己的工作之后,就可以从内存中删除垃圾对象了。需要终结的对象在内存中停留的时间比没有终结器的对象停留的时间长很多。但是你别无选择。如果要使程序有防护性,在类型包含非受控资源的时候,你必须编写一个终结器。但是也不用担心性能问题。下一步确保了客户端避免与终结相关的性能开销。

实现IDisposable接口是一种标准的途径源码天空,它通知用户和运行时系统持有资源的对象必须及时地释放。IDisposable接口仅仅包含一个方法:

public interface IDisposable  void Dispose( );  你对C#调用Dispose()方法的实现(implementation)负责下面四个事务:

1、释放所有的非受控资源。

2、释放所有的受控资源(包括未解开事件)。

3、设置标志表明该对象已经被处理过了。你必须在自己的公共方法中检查这种状态标志并抛出ObjectDisposed异常(如果某个对象被处理过之后再次被调用的话)。

4、禁止终结操作(finalization)。你调用GC.SuppressFinalize(this)来完成这种事务。

通过实现IDisposable接口你完成了两个事务:你为客户端及时地释放自己持有的所有受控资源提供了机制;你为客户端提供了一种释放非受控资源的标准途径。这是一个很大的进步。当你在类型中实现Idisposable接口的时候,客户端可以避免终结操作的开销,你的类就成为.NET世界中的"良民"了。

详细请参考:http://www.codesky.net/article/200908/127376.html

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#Dispose是一种用于释放资源的模式。它通常用于释放托管资源和非托管资源,以确保资源的正确释放和回收。Dispose方法是在实现IDisposable接口的类定义的,它允许开发人员在不等待垃圾回收器的情况下显式释放资源。 在引用\[1\]的示例Dispose方法被实现为一个虚方法,它接受一个布尔值参数disposing。在Dispose方法内部,首先检查是否已经释放了资源,然后根据disposing参数的值来释放托管资源和非托管资源。最后,通过调用GC.SuppressFinalize(this)方法,告诉垃圾回收器不再调用析构函数。 在引用\[2\]的示例Dispose方法也被实现为一个虚方法,它接受一个布尔值参数disposing。在Dispose方法内部,首先检查是否已经释放了资源,然后根据disposing参数的值来释放托管资源和非托管资源。最后,通过设置disposed标志,确保Dispose方法只被调用一次。 在引用\[3\]的示例Dispose方法同样被实现为一个虚方法,它接受一个布尔值参数disposing。在Dispose方法内部,首先检查是否已经释放了资源,然后通过调用SafeNativeMethods.Gdip.GdipDisposeImage方法释放非托管资源。最后,通过调用GC.SuppressFinalize(this)方法,告诉垃圾回收器不再调用析构函数。 总之,Dispose方法在C#用于释放资源,包括托管资源和非托管资源。通过实现IDisposable接口,并在Dispose方法释放资源,可以确保资源的正确释放和回收。 #### 引用[.reference_title] - *1* *2* *3* [C#Dispose](https://blog.csdn.net/qq_39033826/article/details/122016981)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值