C#实现IDispose模式

 .net的GC机制有两个问题:首先GC并不能释放所有资源,它更不能释放非托管资源。其次,GC也不是实时的,所有GC存在不确定性。
为了解决这个问题.NET提供了析构函数

public class DisposeClass : System.IDisposable
{
    //供程序员显式调用的Dispose方法
    public void Dispose()
    {
        //调用带参数的Dispose方法,释放托管和非托管资源
        Dispose(true);
        //手动调用了Dispose释放资源,那么析构函数就是不必要的了,这里阻止GC调用析构函数
        System.GC.SuppressFinalize(this);
    }

    //protected的Dispose方法,保证不会被外部调用。
    //传入bool值disposing以确定是否释放托管资源
    protected void Dispose(bool disposing)
    {
        if (disposing)
        {
            ///TODO:在这里加入清理"托管资源"的代码,应该是xxx.Dispose();
        }
        ///TODO:在这里加入清理"非托管资源"的代码
    }

    //供GC调用的析构函数
    ~DisposeClass()
    {
        Dispose(false);//释放非托管资源
    }
}

  而即使我们忘记了在合适的时候调用Dispose,GC也会在释放对象的时候帮我们清理非托管资源的。GC所充当的角色只是一种保障手段,它应该充当这种角色,我们不能过分依赖它。实际上,在较大的模块退出时我们还应该及时地手动调用GC.Collect进行垃圾回收。

C#实现IDispose模式

时间: 2024-10-29 19:08:38

C#实现IDispose模式的相关文章

C#中标准的IDispose模式

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

标准IDispose模式浅析

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

.Net 使用sos.dll调式OutOfMemoryException

做了几年的.net开发,还是第一次实际碰到抛出OutOfMemoryException的情况,做了一下代码检查,没有发现什么问题,就决定用sos.dll调试一下. sos.dll是一个扩展库,用来帮助在visual studio或者windows debugger(WinDbg.exe)里面调试managed的程序,它可以提供CLR内部的情况.对于内存耗尽这种现象,很可能是因为有root还指向着对象而没有被垃圾回收,如果你从代码里面不能很容易找出是哪里,sos.dll应该能帮助解决这类问题. 使

【Windows10 IoT开发系列】开发人员模式设置

原文:[Windows10 IoT开发系列]开发人员模式设置  声明:本文转自微软Windows 开发人员中心(https://msdn.microsoft.com/library/windows/apps/xaml/dn706236.aspx),在此基础上进行删减和修改. ​对于要用于开发.安装或测试应用的设备,不再需要开发人员许可证.你只需从设备的设置中为这些任务启用设备一次.(仅限于运行Windows 10系统的设备) 使用开发人员功能 ​使用 Microsoft Visual Stud

浅析selenium的PageFactory模式

前面的文章介绍了selenium的PO模式,见文章:http://www.cnblogs.com/qiaoyeye/p/5220827.html.下面介绍一下PageFactory模式. 1.首先介绍FindBy类: For example, these two annotations point to the same element: @FindBy(id = "foobar") WebElement foobar; @FindBy(how = How.ID, using = &q

Java设计模式学习笔记,三:建造者模式

建造者模式:实现了构建和装配的解耦,即对象的各个子组件单独构建,再进行装配,从而建造完整对象. 该模式适用于构建较为复杂的对象(多个子组件). 不同的构建者,使用相同的装配者,可以建造不同的对象实例.相同的构建者,不同的装配顺序,也可能建造出不同的对象实例. 举例: 汽车对象,子组件包括引擎.轮子和车体. Audi汽车构建者,负责制造Audi牌各个子组件.BMW汽车构建者,负责制造BMW牌各个子组件.然后将子组件统一送至汽车装配者的生产线中进行组装,最后会建造出Audi牌汽车和BMW汽车. 以下

微领地小蜜app模式系统开发详解

如今企业竞争的最高境界, 不再是产品的竞争.人才的竞争.营销的竞争-- 而是一种商业模式(即赢利模式)的竞争. 微领地小蜜软件,微领地小蜜系统,小蜜APP,微领地小蜜平台,微领地小蜜开发公司,微领地小蜜服务模式,微领地小蜜商圈.O2O.C2B.B2C.F2C.B2B.C2N.C2C等微商城.App.手机网页.PC商城.小程序,微商管理系统.一物一码.防伪防窜.扫码红包.质量追溯.分销.全返.分红.拼团.互联网+直播+定制服务·系统开发提供中心. 回首过去,创新与发展裹带着机遇和挑战,微领地小蜜在

抽象工厂模式

思考:工厂方法模式:http://www.cnblogs.com/maggiejyt/p/7561253.html 工厂方法模式UML: 问题:如果这家工厂不止要生产Ball(球),还要还有Sneakers(球鞋)等 则UML图为 当Product有多种类时则是抽象工厂模式 代码(Ball的代码见简单工厂模式:http://www.cnblogs.com/maggiejyt/p/7561253.html) Sneakers(球鞋抽象类) package com.maggie.FactoryMet

[BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1297  Solved: 705 [Submit][Status][Discuss] Description 农夫John发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个"模式". John的牛奶按质量可以被赋予一个0到100