博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#知识点总结系列:2、C#中IDisposable和IEnumerable、IEnumerator
阅读量:5788 次
发布时间:2019-06-18

本文共 3673 字,大约阅读时间需要 12 分钟。

C#中如何合理的释放非托管内存?在本文中我们将讲解使用IDisposable释放托管内存和非托管内存。

  A.首先需要让类实现IDisposable接口,然后实现IDispose方法。

    A.a核心Disponse(bool isDisponse)

      1.此方法首先判断isReadyDisposed(判断是否第一次调用此核心方法),如果不是第一次调用则不做任何操作。

      2.再判断是否是析构函数调用?如果是析构函数调用不释放托管资源,其交由GC进行释放,如果析构函数释放托管资源可能之前GC释放过,就会导致出现异常。此判断内部释放托管资源内存。

      3.释放非托管资源,并且设置标志位isReadyDisposed=true.

  B.然后分释放托管内存和非托管内存两种情况进行内存释放处理。

    B.a释放非托管内存

      1.释放非托管内存需要手动调用本类的Dispose()方法,此方法首先调用Dispose(true)手动释放托管和非托管资源,然后调用GC.SuppressFinalize(this),让GC不要再调用此对象的析构函数。

    B.b释放托管内存

      1.释放托管内存是由GC自动调用析构函数,析构函数内部调用Dispose(false)方法.此时只释放非托管资源,而托管资源不管,由GC自行释放。

  我们实现好的类代码如下:

public class IDisponseTest : IDisposable    {        private bool isReadyDisposed = false;        ~IDisponseTest()        {            //析构函数调用时不释放托管资源,因为交由GC进行释放            Disponse(false);        }        public void Dispose()        {            //用户手动释放托管资源和非托管资源            Disponse(true);            //用户已经释放了托管和非托管资源,所以不需要再调用析构函数            GC.SuppressFinalize(this);                        //如果子类继承此类时,需要按照如下写法进行。            //try            //{            //    Disponse(true);            //}            //finally            //{            //    base.Disponse();            //}        }        public virtual void Disponse(bool isDisponse)        {            //isReadyDisposed是控制只有第一次调用Disponse才有效才需要释放托管和非托管资源            if (isReadyDisposed)                return;            if (isDisponse)            {                //析构函数调用时不释放托管资源,因为交由GC进行释放                //如果析构函数释放托管资源可能之前GC释放过,就会导致出现异常                //托管资源释放            }            //非托管资源释放            isReadyDisposed = true;        }    }

   C#制作一个迭代器对象?使用IEnumerable、IEnumerator

  首先:让类继承IEnumerable和IEnumerator接口,此时此类会出现IEnumerable.GetEnumerator()方法和IEnumerator.Current属性、IEnumerator.MoveNext(),IEnumerator.Reset()方法。

  其次:IEnumerator接口是对象遍历的方法和属性实现,而IEnumerable.GetEnumerator()方法是为了获取IEnumerator对象。

  最后:我们看看迭代器代码实现如下实例:

class Program    {        static void Main(string[] args)        {            CubeEnum cubelist = new CubeEnum(50);            foreach(Cube cube in cubelist)            {                Console.WriteLine("立方体长:" + cube.Length + ",宽" + cube.Width + ",高" + cube.Height);            }            Console.Read();        }    }    //立方体,长、宽、高    public class Cube    {        public int Length { get; set; }        public int Width { get; set; }        public int Height { get; set; }    }    ///     /// 立方体迭代集合,继承了IEnumerable和IEnumerator    ///     public class CubeEnum : IEnumerable, IEnumerator    {        //索引        public int Index { get; set; }        //立方体集合        public Cube[] cubelist { get; set; }        //初始化立方体集合        public CubeEnum(int count)        {            this.Index = -1;            cubelist = new Cube[count];            for (int i = 0; i < count; i++)            {                cubelist[i] = new Cube();                cubelist[i].Length = i * 10;                cubelist[i].Width = i * 10;                cubelist[i].Height = i * 10;            }        }        //实现IEnumerable的 GetEnumerator() 方法获得IEnumerator对象        public IEnumerator GetEnumerator()        {            return (IEnumerator)this;        }        //当前Cube立方体        public object Current        {            get { return cubelist[Index]; }        }        //往下一步移动        public bool MoveNext()        {            Index++;            if (Index < cubelist.Length)            {                return true;            }            return false;        }        //重置索引        public void Reset()        {            Index = -1;        }    }

  本文讲述的是C#基础的应用,如有差错,敬请斧正。

本文转自程兴亮博客园博客,原文链接:http://www.cnblogs.com/chengxingliang/archive/2013/04/22/3033204.html,如需转载请自行联系原作者

你可能感兴趣的文章
qml demo分析(clocks-时钟)
查看>>
vue去掉#——History模式
查看>>
2018年7月第一周网站建站笔记
查看>>
jasperReport例子
查看>>
MongoDB工具MagicMongoDBTool使用介绍(一) -- 简单MongoDB入门
查看>>
javascript的事件
查看>>
android 打开SD卡文件夹,并获得选中文件的路径怎么实现?
查看>>
android 如何实现连接蓝牙打印机来实现打印功能
查看>>
CSS3 高级技术
查看>>
原型模式(Prototype )
查看>>
201521123009 《Java程序设计》第1周学习总结
查看>>
年终述职--常见问题分析解答
查看>>
C#_细说Cookie_Json Helper_Cookies封装
查看>>
对事件循环的一点理解
查看>>
在mui中创建aJax来请求数据..并展示在页面上
查看>>
spring 之AOP
查看>>
总结 15/4/23
查看>>
守护进程
查看>>
Windows 7环境下网站性能测试小工具 Apache Bench 和 Webbench使用和下载
查看>>
C#常见错误解决方法
查看>>