dispose 模式 java_C# Dispose模式详细分析

C#的Dispose模式主要用于及时释放非托管资源,确保资源有效管理。文章详细介绍了Dispose模式的目的,解释了析构函数与Dispose方法的区别,并提供了代码示例。通过使用Dispose模式,开发者可以在手动调用时释放资源,同时在GC回收时也能保证资源释放,提高系统效率。此外,文章解答了关于线程安全和析构函数不释放托管资源的原因。
摘要由CSDN通过智能技术生成

C#Dispose模式

目的:

为了及时释放宝贵的非托管资源和托管资源,并且保证资源在被gc回收的时候可以正确释放资源,同时兼顾执行效率

必须遵循的事实:

1 托管资源释放:

由另一线程的gc进行释放,当托管的对象没有被引用时,就会在“适当的时候”进行回收

如果定义了析构函数,回收的时候会调用析构函数(实际执行可能有差别),之后释放对象占用的内存。

当类有析构函数时, gc会分分两步来释放,如果没有析构函数或者指定不需要调用析构函数时,只需要一步就能释放

2 非托管资源必须显式释放

方案:

1.把资源释放都放在析构函数里。

可以保证资源都释放,但是由于gc调用时机的不确定性,导致宝贵的非托管资源无法及时释放。

2. 写个释放函数,手动是调用

如果忘了释放的话, 托管资源会被gc释放,但非托管资源就无法释放

3. Dispose模式。参考下面的代码

手动调用Dispose() 可以释放所有资源,并且在gc标记不需要再调用析构函数,从而提高了效率。

如果忘记调用Dispose(), 则当gc调用析构函数的时候也会把非托管资源释放掉

-------参考代码-----------

public interfaceIDisposable

{voidDispose();

}public classDisposablClass : IDisposable

{//是否回收完毕

bool_disposed;public voidDispose()

{

Dispose(true);

GC.SuppressFinalize(this); //标记gc不在调用析构函数

}~DisposableClass()

{

Dispose(false);

}private void Dispose(booldisposing)

{if(_disposed) return; //如果已经被回收,就中断执行

if(disposing)

{//TODO:释放本对象中管理的托管资源

}//TODO:释放非托管资源

_disposed = true;

}

}

可能存在的疑问

1. 既然gc是另外一线程执行的,为什么Dispose(bool)函数里不加锁?

答:因为如果可以主动调用的时候,肯定此对象不是死对象,也不会被回收,因此不会同时调用到

2. 为什么析构函数调用的dispose(false)不释放托管资源?

答:因为析构函数由gc来调用,gc会依次释放所有的死对象(不可到达),释放的顺序是随机的,如果在一个对象的析构里调用了一个本次gc已经释放的对象,就会发生释放两次的错误。

这个讲的也不错,就是有点啰嗦:

https://blog.csdn.net/zrf2112/article/details/50644652

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值