C#继承IDisposable释放资源

public class CDisposable : IDisposable
    {
            //析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法
            ~CDisposable()
            {
                Dispose(false);
            } 

            //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率
            void IDisposable.Dispose()
            {
                Dispose(true);
            } 

            //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力
            protected virtual void ReleaseUnmanageResources()
            {
                //Do something...
                Console.WriteLine("Do something... ");
            } 

            //私有函数用以释放非托管资源
            private void Dispose(bool disposing)
            {
                ReleaseUnmanageResources(); 

                //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法
                //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦
                if (disposing)
                {
                    GC.SuppressFinalize(this);
                }
            }  
 public static void ShowResults()
        {
            //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            int sms = Environment.TickCount;
            Console.WriteLine(sms.ToString());
            int i = 0;
            while (i < 100)
            {
                //tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧
                CDisposable tmpObj1 = new CDisposable();
                i++;
            }
            int mms = Environment.TickCount;
            Console.WriteLine(mms - sms);
            //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
            i = 0;
            while (i < 100)
            {
                Console.Write("     ");
                //tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些
                //个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧
                //当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率
                CDisposable tmpObj2 = new CDisposable();
                ((IDisposable)tmpObj2).Dispose();
                i++;
            }
            int ems = Environment.TickCount;
            Console.WriteLine(ems - mms);
            //Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
        } 
时间: 2024-08-04 05:24:18

C#继承IDisposable释放资源的相关文章

编写高质量代码改善C#程序的157个建议——建议46:显式释放资源需继承接口IDisposable

建议46:显式释放资源需继承接口IDisposable C#中的每一个类型都代表一种资源,资源分为两类: 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源:不受CLR管理的对象,如Windows内核对象,或者文件.数据库连接.套接字.COOM对象等. 如果我们的类型使用了非托管资源,或者需要显示地释放托管资源,那么就需要让类型继承接口IDisposable,这毫无例外.这相当于告诉调用者,类型资源是需要显示释放资源的,你需要调用类型的Dispose方法. 一个标

【C#学习笔记】 IDisposable 接口

托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标等.这类资源,垃圾回收器在清理的时候会调用Object.Finalize()方法.默认情况下,方法是空的,对于非托管对象,需要在此方法中编写回收非托管资源的代码,以便垃圾回收器正确回收资源. 在

C#关键字学习

第一部分 一.访问关键字:base,thisbase:访问基类的成员,用于从派生类中访问基类的成员, 1.调用基类上已经被重写的方法. 2.指定创建派生类实例时应调用的基类构造函数. (对基类的访问只能在派生类的构造函数实例的方法和实例的属性访问器中)   属性访问器:get,set函数.不能在静态方法中使用base关键字. 例: 在子类的方法中写 base.GetInfo();调用基类的方法. 基类中的构造函数重载了,Mybase()和Mybase(int i); 在子类的构造函数中publi

[转]改善C#程序的建议4:C#中标准Dispose模式的实现

需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不受CLR管理的对象,windows内核对象,如文件.数据库连接.套接字.COM对象等: 毫无例外地,如果我们的类型使用到了非托管资源,或者需要显式释放的托管资源,那么,就需要让类型继承接口IDisposable.这相当于是告诉调用者,该类型是需要显式释放资源的,你需要调用我的Dispose方法. 不

[.net 面向对象程序设计进阶] (8) 托管与非托管

本节导读:虽然在.NET编程过程中,绝大多数内存垃圾回收由CLR(公共语言运行时)自动回收,但也有很多需要我们编码回收.掌握托管与非托管的基本知识,可以有效避免某些情况下导致的程序异常. 1.什么是托管与非托管? 托管资源:一般是指被CLR(公共语言运行时)控制的内存资源,这些资源由CLR来管理.可以认为是.net 类库中的资源. 非托管资源:不受CLR控制和管理的资源. 对于托管资源,GC负责垃圾回收.对于非托管资源,GC可以跟踪非托管资源的生存期,但是不知道如何释放它,这时候就要人工进行释放

GC 垃圾回收

一.托管 .Net所指的托管资源到底是什么意思呢?是相对于所有资源,还是只限于某一方面的资源?很多人对此不是很了解. 其实.Net所指的托管只是针对内存这一个方面,并不是对于所有的元素:因此对于Stream,数据库的连接GDI+的相关对象,还有Com对象等等,这些资源并不是受到.Net管理而统称为非托管资源.而对于内存的释放和回收,系统提供了GC(Garbage Collector),而至于其他资源则需要手动进行释放. 二.垃圾 什么是垃圾..Net类型分为两大类,一个就是值类型,另一个就是引用

C#中标准Dispose模式的实现

本文引自:http://www.cnblogs.com/luminji/archive/2011/03/29/1997812.html 需要明确一下C#程序(或者说.NET)中的资源.简单的说来,C#中的每一个类型都代表一种资源,而资源又分为两类: 托管资源:由CLR管理分配和释放的资源,即由CLR里new出来的对象: 非托管资源:不受CLR管理的对象,windows内核对象,如文件.数据库连接.套接字.COM对象等: 毫无例外地,如果我们的类型使用到了非托管资源,或者需要显式释放的托管资源,那

C#内存管理解析

前言:对于很多的C#程序员来说,经常会很少去关注其内存的释放,他们认为C#带有强大的垃圾回收机制,所有不愿意去考虑这方面的事情,其实不尽然,很多时候我们都需要考虑C#内存的管理问题,否则会很容易造成内存的泄露问题. 尽管.NET运行库负责处理大部分内存管理工作,但C#程序员仍然必须理解内存管理的工作原理,了解如何高效地处理非托管的资源,才能在非常注重性能的系统中高效地处理内存.C#编程的一个优点就是程序员不必担心具体的内存管理,垃圾回收器会自动处理所有的内存清理工作.用户可以得到近乎像C++语言

using 用法拾忆

using 用法主要包括三种: 1.引用外部命名空间以及外部命名空间中定义的类型(指令) 2.创建命名空间别名,避免因名称相同造成的冲突(指令) 3.定义资源使用范围,在范围结束后释放资源对象(语句) 1. 引用外部命名空间或者类型,允许在在本命名空间内使用引用命名空间类型: using System.IO;using System.Linq;using System.Text; 2.创建命名空间别名,区别相同名称命名空间或类型: using txt= System.Text; using co