代码改变世界

[分享]另一种对 IDisposable 的实现

  Nana's Lich  阅读(327)  评论(1编辑  收藏  举报

相比于刚发出来没多久的关于 MVVM 的文章,对 IDisposable 接口的讨论更是老生常谈了。

详细讲解 IDisposable 的文章也有很多,不想深入了解的看了会头晕,想深入了解的估计也早就了解过了。

所以本文不讲那么多大道理,实用为主,一切从简。

正文

实际上,不管和大家一起讨论过多少次,不管用过多少次,每次再使用 IDisposable 的时候总还是会有点犯迷糊,会怀疑自己实现得到底对不对。

久而久之,对 IDisposable 的实现就产生了一个模板,紧接着模板便理所当然地成了一个抽象类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public abstract class DisposableObject
    : IDisposable
{
    protected DisposableObject()
    {
        IsDisposed = false;
    }
 
    public bool IsDisposed { get; private set; }
 
    protected abstract void Dispose(bool disposing);
 
    public void Dispose()
    {
        if (IsDisposed) return;
 
        Dispose(true);
 
        IsDisposed = true;
 
        GC.SuppressFinalize(this);
    }
 
    ~DisposableObject()
    {
        Dispose(false);
    }
}

实现 IDisposable 的时候只要派生自这个抽象类再覆盖 void Dispose(bool disposing) 这个方法就好了。

需要注意的地方则是:

1、只有当 disposing 的值为 true 时需要改变向外暴露的状态信息,通常来说都是值类型的属性,而当 disposing 为 false 的时候不需要这么做;

2、在 Dispose 方法中只需要释放那些未被封装成托管对象的资源,例如通过 IntPtr 操作的系统对象,而实现了 IDisposable 的对象则不需要在此处进行释放,因为它们同样也实现了 Finalizer。

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
历史上的今天:
2011-01-04 Web Deploy 高级应用:自动设置 ACL
点击右上角即可分享
微信分享提示