《Effective C#》Item 18:Dispose函数的标准实现模式

【科研绘图】【数据拟合曲线】:附Origin详细画图流程 拟合曲线图 阅读详情

对于托管程序来说,非托管资源来说,需要手动来释放,否则会造成资源泄漏,如果放到析构函数去完成,但是GC调用对象的析构函数时机并不确定,对于资源释放并不及时。换句话说析构函数只是保障资源不被泄漏的方法,但不是最好的方法。比较好的方法,就是使用.Net的IDisposable接口提供的Dispose方法来进行释放。

对于程序资源释放,可以参看这篇文章。

http://blog.youkuaiyun.com/knight94/archive/2006/08/05/1023352.aspx

 

那么对于IDisposable接口的Dispose函数,需要做些什么呢。大致有如下四点。

1. 释放所有非托管资源;

2. 释放所有托管资源,这包括取消事件绑定;

3. 设置标志位,标明对象已经释放;

4. 调用“GC.SuppressFinalize(this)”来避免GC再去掉用对象的析构函数。

 

那么对于一个普通类型的Dispose实现比较简单,参看前面介绍的文章即可。这里主要说说在继承关系的Dispose函数实现,大致如下:

    public class MyResourceHog: IDisposable

    {

        // Flag for already disposed

        private bool _alreadyDisposed = false;

       

        // Desctructor

        ~MyResourceHog()

        {

            Dispose( true );

        }

 

        #region IDisposable Members

        public void Dispose()

        {

            Dispose( true );

            GC.SuppressFinalize( this );

        }

        #endregion

 

        protected virtual void Dispose( bool isDisposing )

        {

            // Don't dispose more than one

            if( _alreadyDisposed )

                return;

 

            if( isDisposing )

            {

                // TODO: free managed resources here

            }

            // TODO: free unmanaged resources here

 

            // Set disposed flag

            _alreadyDisposed = true;

        }

    }

 

    public class DerivedResourceHog: MyResourceHog

    {

        // Its own disposed flag

        private bool _disposed = false;

 

        protected override void Dispose(bool isDisposing)

        {

            // Don't dispose more than one

            if( _disposed )

                return;

 

            if( isDisposing )

            {

                // TODO: free managed resources here

            }

            // TODO: free unmanaged resources here

 

            // Let the base class free its resources

            // by calling GC.SuppressFinalize()

            base.Dispose (isDisposing);

 

            // Set disposed flag

            _disposed = true;

        }

 

    }

 

那么在继承关系实现IDisposable函数,而且比较常见的,就数Form类型了。这也就是在自定义的Form类型中,Dispose函数都是Protected,而且参数不同于IDisposable中的Dispose函数,这就是一个比较鲜明的例子。

这里要说的一点,Form有两种显示模式,第一种是通过Show来非模式显示,那么当窗体关闭的时候,系统会帮你调用窗体的Dispose方法;而第二种是通过ShowDialog来模式显示,那么当窗体关闭的时候,此操作相当于窗体执行Hide操作。造成的后果,对于第一种显示方式,在窗体关闭后,需要重新创建实例,才能通过Show显示出来;而后一种是不需要的。不过后者有个缺陷,如果窗体的资源是通过Dispose方法进行释放的话,不会很及时。为了适合两种方式显示,我比较喜欢在Closing事件中去释放窗体所占用的非托管资源。

 

除此外,在编写析构函数时候,特别要注意的就是防止对象“复活”,即在析构函数中把当前对象以引用的方式传递给别的对象。这样会造成,系统已经调用过对象的析构函数,但是对象还有效,从而导致对象无法被释放,即造成内存泄漏。

 

由于前面说得比较多了,因此对于这个章节来说,没有太多的关键点,唯一就在于继承对象中Dispose函数的实现方法,这点与单独类型中的实现不同,要特别注意。

 
最全中文停用词表(可直接复制) 最全的停用此表整理 词表名 词表文件 中文停用词表 cn_stopwords.txt 哈工大停用词表 hit_stopwords.txt 百度停用词表 baidu_stopwords.txt 机器智能实验室停用词库 scu_stopwords.txt 以上停用词表链接:https://github.com/goto456/stopwords 以下是我常用的1893个停用词,可直接复制 ! " # $ % & ' ( ) * + , - -- . .. ... .... 阅读详情

相关推荐

STM32F103+W5500网络通信

STM32F103+W5500网络通信一、W5500模块(一)W5500以太网模块介绍(二)模块排针功能表二、 modbus协议(一)modbus协议原理(二)Modbus 通讯方式1.Modbus三种通讯方式2.在Modbus网络上传输3.以太网(modbus tcp/ip)三、参考资料 一、W5500模块 (一)W5500以太网模块介绍 D-W5500 EVB以太网模块是一款基于WIZnet W5500芯片的以太网模块,且性价比高的以太网模块。W5500是一款全硬件TCP/IP嵌入式以太网控制器,为

”一只特立独行的猪“的博客 1万+

c#接口和抽象类的区别

c#接口和抽象类的区别 大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料. 一、抽象类: 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。 二...

huang714的专栏 4471

嵌入式开发必备:UART、RS232、RS485通信协议实战对比(附代码示例)

本文从嵌入式开发实战角度,深度对比了UART、RS232和RS485三种核心串行通信协议。详细解析了它们的工作原理、硬件连接、代码配置及典型应用场景,并提供了基于通信距离、节点数量和电磁环境的三维度选型指南,帮助开发者根据项目需求做出最优技术决策。

i0j1k2l3m的博客 474

C# 抽象类与接口的区别

一、定义   抽象类:不与具体事物相联系,表达一种抽象的概念,仅是作为其派生类的一个基类。主要用来提供多个派生类可共享的基类的公共定义。   接口:是一种用来定义程序的协议,它描述可属于任何类或结构的一组相关行为,可以看成是实现一组类的模板。 二、相似之处   1.都是引用类型   2.不能直接实例化   3.包含未实现的方法声明   4.派生类必须实现未...

weixin_30902675的博客 1368

MATLAB2021b详细安装教程

1.下载 2.安装 下载安装包后打开iso文件,若是无法打开请用解压软件打开。 ①打开MATLAB_R2021b_win64,双击软件开始安装 ② 一直点击下一步,直到步骤③ ③选择我已有我的许可证的文件密钥,并输入62551-02011-26857-57509-64399-54230-13279-37181-62117-65158-40352-64197-45508-24369-45954-39446-39538-16936-10698-58393-44718-32560-10501-40

惜洛-Jankin的博客 9万+

Windows下Anaconda和PyTorch深度学习环境完整安装配置教程

本文详细介绍了在Windows系统下安装配置PyTorch深度学习环境的完整流程。主要内容包括:硬件环境检查(确认GPU支持)、Anaconda环境管理系统的安装与配置、虚拟环境的创建与管理方法、以及PyTorch及其相关组件的安装指南。特别强调了版本兼容性选择策略(如CUDA版本的确定)、显卡驱动更新、使用Anaconda创建隔离的PyTorch专用环境等关键步骤。无论是使用CPU还是GPU版本,读者都能按照教程快速搭建稳定的PyTorch开发环境,为深度学习项目打下坚实基础。

FJN110的博客 973

《Effective C#》Item 19:推荐在继承中使用接口

.Net提供了接口,这个不同于Class或者Struct的类型定义。接口有些情况,看似和抽象类一样,因此有些人认为在.Net可以完全用接口来替换抽象类。其实不然,接口和抽象类各有长处和缺陷,因此往往在应用当中,两者要结合来使用,从而互补长短。 接下来先说说抽象类和接口的区别。区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是

愚翁专栏 8463

CosyVoice语音合成使用教程

CosyVoice是一款开源的语音合成工具,它基于深度学习模型,能够生成高度逼真的语音内容。该工具支持多种语言的语音生成,包括中文、英文、日文、粤语和韩语。CosyVoice的亮点在于它对生成语音情感和韵律的精细控制,通过富文本或自然语言输入,可以显著提升合成语音的情感表达能力。CosyVoice提供了多种预训练模型,用户可以根据需求选择合适的模型。:基底模型,适用于一般语音合成任务。:经过SFT微调的模型,适用于特定音色和情感的语音合成。:支持Instruct微调的模型,适用于自然语言控制的语音合成。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 4442

浅谈C#中的抽象类(abstract)和接口(interface)

很多C#的初学者在编程时都容易把抽象类和接口搞混,甚至很多编程老鸟也没有弄明白为什么有了抽象类又搞个接口(这里也包括了本老鸟)。所以这里整理了C#抽象类和接口的区别,详细的分析了抽象类与接口的概念与特性,并对二者作出比对说明。

MarcoPro的博客 4727

采用了fluent模拟了平壁面结霜过程。udf,很经典,可以试试。

利用该模型作为FLUENT中的源项,模拟了在局部冷却下冷表面上的霜形成,以预测霜的形态、温度分布和霜的重量,结果与实验结果吻合良好。结果显示,霜首先围绕冷却块形成,然后逐渐向其他方向扩展,冷却块上方的霜密度最大。随着时间的推移,平均霜厚度逐渐增加,生长速率减慢,而平均霜密度随增长速率变快而增加。相变传递微观过程与机理、蒸发及冷凝换热、强化传热、高效传热管、热泵、制冷、节水节能新技术、电子元器件冷却、余热回收及梯级利用等。udf,很经典,可以试试。工程热物理、空调、热能、低温制冷、化工、物理等。

qq_15963745的博客 922

CCF编程培训师资认证(PTA)标准(教学能力T)

随着计算机科学的不断发展,计算机相关技术应用到社会各个行业,越来越多的青少年参加到了计算机程序设计的学习中,这对编程培训教师提出了更高的专业要求和职业要求。CCF开展编程培训师资认证项目(Programming Trainer Accreditation,PTA),旨在建立一个规范的、科学的、权威且有公信力的三方认证。认证考试分编程专业能力(P)和教学能力(T)两部分。本标准根据《CCF编程培训师资认证条例》第十条制定,旨在明确教学能力(T)的测试标准。

lan_in的博客 1709

C# 接口和抽象类的区别

一、抽象类 抽象类是仅供派生的类,无法实例化抽象类,只能实例化它派生的类。 定义抽象类和抽象成员时,要为其添加abstract修饰符。 不可实例化只是抽象类的一个次要的特征,其主要特征是它包含抽象成员。 抽象成员不能声明为私有,否则,派生类无法找到它们。 二、接口 1.和抽象类不同,接口不包含任何实现,而且,接口能把提供的服务和实现细节完全隔离开。 2.关键特点:既不包含实现,也不包含数据。...

mozhi 1976

SIWAVE仿真PCB操作说明

使用SIWAVE进行PCB仿真提取S参数的操作

sinat_15150363的博客 3066

[转载]《Effective C#》Item 18:Dispose函数的标准实现模式

《Effective C#》Item 18:Dispose函数的标准实现模式《Effective C#》Item 18:Dispose函数的标准实现模式 对于托管程序来说,非托管资源来说,需要手动来释放,否则会造成资...

congji3817的博客 142

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Effective C# Item18: Implement the Standard Dispose Pattern

Effective C#Item18: Implement the Standard Dispose Pattern 释放非托管资源是非常重要的一个环节。对于我们自定义的类型来说,如果需要释放资源,那么我们应当使用.Net Framework的标准模式来释放非托管资源。标准模式使用IDisposable接口来显式释放资源,而当用户忘记释放时使用终结器(finalizer)...

aijinyao5713的博客 222

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Effective C# Item18:实现标准Dispose模式

如果一个类型中包含了非托管的资源,那么我们应该自己编写释放非托管资源的方法。.NET提供了一个标准的用于释放资源的模式,叫做Dispose模式,在这种模式中,类型实现IDisposable接口,并提供一个终结器。这样,正常流程下类型的使用者调用Dispose()方法来释放资源,如果用户忘记调用Dispose()方法, 那么类型的终结器会作为最后的保障来释放对象的非托管资源。     在Dispo

尹自强.DoSomething() 510

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C#中接口和抽象类的区别

相同点: 1、都可以被继承2、都不能被实例化3、都可以包含方法声明4、派生类必须实现未实现的方法 区别: 1、抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段。2、抽象类是一个不完整的类,需要进一步细化,而接口是一个行为规范。微软的自定义接口总是后带able字段,证明其是表述一类“我能做。。。”3、接口可以被多重实现,抽象类只能被

qq_37656244的博客 1576

C#之抽象类与接口详解

C#中的抽象类和接口是实现多态的两种核心机制。抽象类作为不能实例化的基类,可以包含抽象成员、虚方法和普通方法,适合代码复用和模板方法模式,但仅支持单继承。接口则定义契约而非实现,支持多重继承,C#8.0后允许默认实现,常用于插件系统、跨组件通信等松耦合场景。关键区别在于:抽象类侧重代码共享,接口侧重行为契约。实际开发中常组合使用,抽象类提供基础实现,接口扩展特定能力。显式接口实现可解决多接口命名冲突问题。

weixin_45590420的博客 1660

C#接口与抽象类的区别

C#基础知识,接口和抽象类,整理总结,学习笔记

qq_44618510的博客 2954

C#抽象类与接口的区别及应用场合

本文通过代码的逐个解析来体验抽象类与接口的区别以及应用。

河西~石头 3202

C#接口与抽象类深度解析:核心差异与选型指南

实现方式​接口仅定义方法签名​(无实现),强调“能做什么”(CAN-DO关系)。// 无方法体​抽象类可包含抽象方法​(无实现)和具体方法​(有实现),强调“是什么”(IS-A关系)。// 抽象方法public void Sleep() { // 具体方法​是否需要共享代码?是 → 抽象类否 → 接口​是否需要多继承?是 → 接口否 → 根据其他因素选择​是否需要维护状态?是 → 抽象类否 → 接口​是否预期未来频繁扩展?

品质生活,极致编程。 1117
上一篇: 《Effective C#》Item 17:减少装箱(Boxing)和拆箱(Unboxing)操作
下一篇: 《Effective C#》Part II:第二部分总结
Knight94
博客等级 码龄25年 1013粉丝 87原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值