源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

基于C#中IDisposable与IEnumerable、IEnumerator的应用

  • 时间:2021-10-02 01:08 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:基于C#中IDisposable与IEnumerable、IEnumerator的应用
  C#中如何合理的释放非托管内存?在本文中我们将讲解使用IDisposable释放托管内存和非托管内存。   [i][b]A.[/b][/i]首先需要让类实现IDisposable接口,然后实现IDispose方法。     A.a[b]核心Disponse(bool isDisponse)[/b]       1.此方法首先判断isReadyDisposed(判断是否第一次调用此核心方法),如果不是第一次调用则不做任何操作。       2.再判断是否是析构函数调用?如果是析构函数调用不释放托管资源,其交由GC进行释放,如果析构函数释放托管资源可能之前GC释放过,就会导致出现异常。此判断内部释放托管资源内存。       3.释放非托管资源,并且设置标志位isReadyDisposed=true.   [i][b]B.[/b][/i]然后分释放托管内存和非托管内存两种情况进行内存释放处理。     B.a[b]释放非托管内存[/b]       1.释放非托管内存需要手动调用本类的Dispose()方法,此方法首先调用Dispose(true)手动释放托管和非托管资源,然后调用GC.SuppressFinalize(this),让GC不要再调用此对象的析构函数。     B.b[b]释放托管内存[/b] [b]      [/b]1.释放托管内存是由GC自动调用析构函数,析构函数内部调用Dispose(false)方法.此时只释放非托管资源,而托管资源不管,由GC自行释放。   我们实现好的类代码如下:
[u]复制代码[/u] 代码如下:
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   [b]首先:[/b]让类继承IEnumerable和IEnumerator接口,此时此类会出现IEnumerable.GetEnumerator()方法和IEnumerator.Current属性、IEnumerator.MoveNext(),IEnumerator.Reset()方法。   [b]其次:[/b]IEnumerator接口是对象遍历的方法和属性实现,而IEnumerable.GetEnumerator()方法是为了获取IEnumerator对象。   [b]最后:[/b]我们看看迭代器代码实现如下实例:
[u]复制代码[/u] 代码如下:
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; }     }     /// <summary>     /// 立方体迭代集合,继承了IEnumerable和IEnumerator     /// </summary>     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#基础的应用,如有差错,敬请斧正。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部