c#标准idispose模式使用示例

IDispose模式在C++中用的很多,用来清理资源,而在C#里,资源分为托管和非托管两种,托管资源是由C#的CLR帮助我们清理的,它是通过调用对象的析构函数完成的对象释放工作,而对于非托管系统来说,则需要我们自己来释放,例如数据库连接对象,这就需要我们手动去调用它的Dispose()方法来实现对象它的释放,事实上,Dispose()内容到底做了什么事,我们并不清楚,当然这就是面向对象,它不希望你关系实现的细节,呵!

对于我们开发人员来说,在了解它怎么用之后,总会对它如何实现的产生兴趣,下面,我将把C#里实现IDispose模式的代码展现出来,大家一起来学习一下,事实上,它的使用场合也很多的,当我们手动对网站,数据库作封装时,都会用的到,下面看一下代码:

代码如下:

/// <summary>
    /// 实现IDisposable,对非托管系统进行资源回收
    /// </summary>
    public class IDisplosePattern : IDisposable
    {
        public void Dispose()
        {
            this.Dispose(true);////释放托管资源
            GC.SuppressFinalize(this);//请求系统不要调用指定对象的终结器. //该方法在对象头中设置一个位,系统在调用终结器时将检查这个位
        }

protected virtual void Dispose(bool disposing)
        {
            if (!_isDisposed)//_isDisposed为false表示没有进行手动dispose
            {
                if (disposing)
                {
                    //清理托管资源
                }
                //清理非托管资源
            }
            _isDisposed = true;
        }

private bool _isDisposed;

~IDisplosePattern()
        {
            this.Dispose(false);//释放非托管资源,托管资源由终极器自己完成了
        }
    }

通过上面的代码,我们知道了,对于托管系统(C#的CLR为我们管理的),直接通过~IDisplosePattern()方法进行释放,而~IDisplosePattern()这个方法何时被调用,我们是不知道的,因为它是由CLR帮助我们调用的,而我们手动进行dispose方法时,它会调用dispose(true)这个重载方法,它会帮助我们清理托管和非托管资源。

(0)

相关推荐

  • C#中析构函数、Dispose、Close方法的区别

    一.Close与Dispose这两种方法的区别 调用完了对象的Close方法后,此对象有可能被重新进行使用:而Dispose方法来说,此对象所占有的资源需要被标记为无用了,也就是此对象要被销毁,不能再被使用.例如常见.Net类库中的SqlConnection这个类,当调用完Close方法后,可以通过Open重新打开一个数据库连接,当彻底不用这个对象了就可以调用Dispose方法来标记此对象无用,等待GC回收. 二.三者的区别如图 析构函数 Dispose方法 Close方法 意义 销毁对象 销毁

  • C#基础:Dispose()、Close()、Finalize()的区别详解

    .net内存回收与Dispose﹐Close﹐Finalize方法一. net的对象使用一般分为三种情况﹕1.创建对象2.使用对象3.释放对象二.创建对象1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象2.变量类型宣告(declare),如﹕ 复制代码 代码如下: FileStream fs 这行代码会在当前的变量作用域空间(栈或堆)里建立一个叫做fs的变量﹐至少四个字节吧(因为要存一个对象的地址)3.初始化对象对象在使用(调用其方法或属性)前﹐必须进行初始化.如﹕ 复制代码 代码如下:

  • 探讨C#中Dispose方法与Close方法的区别详解

    群里有人问,怎样直接清空堆里的string值.有人建议直接用Dispose()方法:Dispose()销毁了对象,是一种垃圾回收机制.(这里用using或许更好)当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别? 在这里,要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类:托管资源:由CLR管理分配和释放的资源,即由CLR里ne

  • asp.net sqlconnection con.close和con.dispose区别

    con.close() 是关闭连接,实际上是把连接放回ado.net的连接池,并没有真正关闭,所以再次连接时只是把连接从池中拿出来用,速度很快. con.dispose是用来释放对象的所在内存,相对于new sqlconnection(): 只用dispose是不能关闭connection的,两者不是一回事,只用close也不能释放它所占的内存. conn.dispose() 是销毁连接,彻底关闭.

  • C#使用Dispose模式实现手动对资源的释放

    本文实例讲述了C#使用Dispose模式实现手动对资源的释放.分享给大家供大家参考.具体实现方法如下: //单一类的实现 class MyClass : IDisposable { public MyClass(){} ~MyClass() { // In case the client forgets to call // Dispose , destructor will be invoked for Dispose(false); } protected virtual void Disp

  • c#标准idispose模式使用示例

    IDispose模式在C++中用的很多,用来清理资源,而在C#里,资源分为托管和非托管两种,托管资源是由C#的CLR帮助我们清理的,它是通过调用对象的析构函数完成的对象释放工作,而对于非托管系统来说,则需要我们自己来释放,例如数据库连接对象,这就需要我们手动去调用它的Dispose()方法来实现对象它的释放,事实上,Dispose()内容到底做了什么事,我们并不清楚,当然这就是面向对象,它不希望你关系实现的细节,呵! 对于我们开发人员来说,在了解它怎么用之后,总会对它如何实现的产生兴趣,下面,我

  • C#中标准的IDispose模式代码详解

    C#实现IDispose接口 .net的GC机制有两个问题:首先GC并不能释放所有资源,它更不能释放非托管资源.其次,GC也不是实时的,所有GC存在不确定性. 为了解决这个问题donet提供了析构函数 public class TestClass : System.IDisposable { //供程序员显式调用的Dispose方法 public void Dispose() { //调用带参数的Dispose方法,释放托管和非托管资源 Dispose(true); //手动调用了Dispose

  • python得到单词模式的示例

    如下所示: def getWordPattern(word): pattern = [] usedLetter={} count=0 for i in word: if i not in usedLetter: usedLetter[i]=count count+=1 pattern.append(str(usedLetter[i])) return '.'.join(pattern) def main(): print getWordPattern("hello") if __nam

  • Python3实现建造者模式的示例代码

    建造者模式 建造者模式用于创建复杂的对象.使用建造者模式可以使复杂的过程层次明了.清晰,把对象的创建以及使用进行了解耦.实际上从代码的角度上看,是进行了多次封装,使代码结构更为规范合理,层次结构更加鲜明. 在一个复杂的对象中,需要编写大量的代码去实现这一个类,并且在进行初始化时,也有可能会有大量的参数去进行初始化. 建造者模式把实现一个类给拆分成多个创建步骤,这些步骤在大多数相关资料中,一般以拟人化的形式进行表达:例如建造者.指挥者以及导演者,但是这些名词的拟人化并不能完全的让读者能够get到完

  • C++实现模板方法模式的示例代码

    外观模式 目录 模式定义 模板方法模式(Facade),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模式动机 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理. 既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复嗲吗都应该要上升到父类去,而不是让每个子类都去重复. UML类图 源码实现 abstractclas

  • Spring 环境下实现策略模式的示例

    背景 最近在忙一个需求,大致就是给满足特定条件的用户发营销邮件,但是用户的来源有很多方式:从 ES 查询的.从 csv 导入的.从 MongoDB 查询-.. 需求很简单,但是怎么写的优雅,方便后续扩展,就存在很多门道了. 我们的项目是基于 Spring Boot 开发的,因此这篇文章也会基于 Spring Boot 作为基础框架,教你如何使用 Spring 依赖注入的特性,优雅的实现策略模式. 1. 简单粗暴 最简单粗暴直接的方式莫过于 if...else- 了,伪代码如下: if(来源 ==

  • 使用SpringBoot实现微服务超时重试模式的示例

    使用resilience4j的库和Spring Boot设计高弹性的微服务. 微服务本质上是分布式的.当您使用分布式系统时,请始终记住这一第一法则- 网络中可能发生任何事情.处理任何此类意外故障可能很难解决.故障可能是任何东西-应用程序,硬件或网络等. 系统从故障中恢复并保持正常运行的能力使系统更具 弹性.它还避免了下游服务的任何级联故障. 重试模式: 在微服务体系结构中,当有多个服务(A,B,C和D)时,一个服务(A)可能依赖于另一服务(B),而另一服务(B)又可能依赖于C,依此类推.有时由于

  • Java设计模式之建造者模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 建造者模式的优势: 注意点 定义 建造者模式(Builder Pattern),又叫生成器模式,是一种对象构建模式 它可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象.建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可 以构建它们,用户不需要知道内部的具体构建细节. 案例 需求 女生每天化妆,假如只需要做发型,香水,衣服,并要求按照发型——>香水——>衣服的顺序进行,

  • Java设计模式之原型模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 即实现了一个原型接口,该接口用于创建当前对象的克隆,当直接创建对象的代价比较大时,则采用这种模式 案例 需求 张三要打印100000份照片 方案一 定义照片类 /** * 照片类 * @author:liyajie * @createTime:2022/2/15 11:47 * @version:1.0 */ @Data @AllArgsConstructor publi

  • Java设计模式之桥接模式的示例详解

    目录 定义 案例 需求 方案一 方案二 对比分析 总结 定义 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”. 案例 需求 通过企业微信和qq的方式给员工发送消息 方案一 定义发送消息的接口 /** * 发送消息的接口 * @author:liyajie * @createTime:2022/2/21 10:33

随机推荐