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

dispose 模式 java_C# Dispose模式详细分析相关推荐

  1. dispose 模式 java_C#中标准Dispose模式的实现

    需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不 ...

  2. java消费者模式_基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

  3. Java 代理模式的实现和原理详细分析

    文章目录 代理模式 静态代理 1. 静态代理的概念 2. 静态代理的实现 动态代理 1. 动态代理的概念 2. 动态代理的实现 2.1 如何创建一个动态代理对象 2.2 完整的动态代理的例子 3.动态 ...

  4. java生产线消费者,基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

  5. IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解

    IIS 7.0 支持两种管道模式:一种是IIS 7.0最新提供的集成管道模式,另一种是经典管道模式,经典管道模式是由先前版本的IIS提供的. 我们可以通过应用程序池设置管道模式,这项功能对IIS管理员 ...

  6. 物联网模式下的污水处理前景分析

    绿色制造是生态文明建设的重要内容.工业化为社会创造了巨大财富,提高了人民的物质生活水平,同时也消耗了大量资源,给生态环境带来了巨大压力,影响了国家整体产业的健康发展.我国作为制造大国,尚未摆脱高投入. ...

  7. 对VC++下Debug模式和Release模式的简要分析

    // // 备注:本篇文章来自 vc驿站:http://www.cctry.com/thread-254205-1-1.html // C.C++.VC++ 各种学习资源,免费教程,期待您的加入! / ...

  8. Android属于绑定服务特点是,Android P HIDL服务绑定模式与直通模式的分析 (原创)

    从Android 8.0之后,Android 引入Treble机制,主要是为了解决目前Android 版本之间升级麻烦的问题,将OEM适配的部分vendor与google 对android  大框架升 ...

  9. 序列号及序列号生成器(号段模式,数据库模式)详细介绍(建议收藏)

    前言 现如今,数据的唯一性和可追溯性变得越来越重要.从简单的数据库主键到复杂的分布式系统,唯一标识符在各种场景中都发挥着关键作用.序列号,作为一种广泛应用的唯一标识符,为我们提供了确保数据完整性和一致 ...

最新文章

  1. 回溯 皇后 算法笔记_回溯算法:N皇后问题
  2. matlab pause
  3. 本地jar文件中搜索class
  4. php jquery 源码,最新版jQuery 2.1.0完整
  5. python 共享内存_37. Python 多进程锁 多进程共享内存
  6. 使用threading模块实现多线程
  7. hyperv虚拟机网络速度慢问题的解决办法
  8. vi中如何跳到指定行
  9. plsql创建中文表头_不安装oracle连接plsql,Oracle instantclient安装详解
  10. 微信小程序页面实现防抖
  11. 即时通信工具中同步离线会话消息的方法及装置
  12. 【BZOJ5109】【CodePlus2017】大吉大利,晚上吃鸡!
  13. moment 秒级时间戳转格式
  14. 伪装成抖音国际版Tiktok的短信蠕虫(病毒分析)
  15. VLAN间如何实现互连?干货奉上!!!
  16. Java爬取网页数据
  17. 51单片机:流水灯蜂鸣器控制
  18. 计算机监控系统功能概述,物联网技术在计算机监控系统的应用
  19. 三维设计SolidWorks
  20. 软工网络15团队作业2——团队计划

热门文章

  1. 教你玩转 MacBook 菜单栏
  2. 揭秘,轻松实现日吸1000+精准粉
  3. VM VirtualBox安装rhel-server-6.5-x86_64系统
  4. 自动驾驶全球布局(2)创业公司
  5. 程序化广告定量评估收益指标——eCPM
  6. Delphi 英文单词收集
  7. 雷哥带你走进Javascript
  8. django_orm数据库查询语句
  9. Web前端入门(六)表格
  10. 面试时自我介绍怎么说,一个程序媛找了半年工作之后,写下了这段文字: