网站在线帮助如何设计,网页和网站有什么分别,网站开发和软件开发含义,湖北网站制作公司的联系方式C#中IDisposable 更多2014/9/7 来源#xff1a;C#学习浏览量#xff1a;4185学习标签#xff1a; IDisposable本文导读#xff1a;C#中IDisposable接口的主要用途是释放非托管资源。当不再使用托管对象时#xff0c;垃圾回收器会自动释放分配给该对象的内存。但无法预测进…C#中IDisposable 更多2014/9/7 来源C#学习浏览量4185 学习标签 IDisposable 本文导读C#中IDisposable接口的主要用途是释放非托管资源。当不再使用托管对象时垃圾回收器会自动释放分配给该对象的内存。但无法预测进行垃圾回收的时间。另外垃圾回收器对窗口句柄或打开的文件和流等非托管资源一无所知。将此接口的Dispose方法与垃圾回收器一起使用来显式释放非托管资源。当不再需要对象时对象的使用者可以调用此方法。 在Net中由GC垃圾回收线程掌握对象资源的释放程序员无法掌控析构函数的调用时机。对于一些非托管资源比如数据库链接对象等需要实现IDisposable接口进行手动的垃圾回收。那么什么时候使用Idisposable接口以及如何使用呢 一、IDisposable的接口定义如下 public interface IDisposable{ // Summary: // Performs application-defined tasks associated with freeing, releasing, or // resetting unmanaged resources. void Dispose();} 二IDisposable基本应用 1.定义一个实现了IDisposable接口的类 C# 代码 复制 public class CaryClass :IDisposable{public void DoSomething()
{Console.WriteLine(Do some thing....);}public void Dispose()
{Console.WriteLine(及时释放资源);}}2、两种方式来调用 1、使用Using语句会自动调用Dispose方法 using (CaryClass caryClass new CaryClass()) { caryClass.DoSomething(); } 2、现实调用该接口的Dispose方法 CaryClass caryClass new CaryClass();
try
{caryClass.DoSomething();
}
finally
{IDisposable disposable caryClass as IDisposable;if (disposable ! null)disposable.Dispose();
} 三、IDisposable使用实例 C# 代码 复制 public class DisposablClass : IDisposable{//是否回收完毕bool _disposed;public void Dispose()
{Dispose(true); GC.SuppressFinalize(this);}~DisposableClass()
{Dispose(false);}//这里的参数表示示是否需要释放那些实现IDisposable接口的托管对象protected virtual void Dispose(bool disposing)
{if(_disposed) return; //如果已经被回收就中断执行if(disposing)
{//TODO:释放那些实现IDisposable接口的托管对象}//TODO:释放非托管资源设置对象为null_disposed true;}
} 四、IDisposable实例分析 Dispose()方法 当需要回收非托管资源的DisposableClass类就调用Dispoase()方法。而这个方法不会被CLR自动调用需要手动调用。 ~DisposableClass()析构函数 当托管堆上的对象没有被其它对象引用GC会在回收对象之前调用对象的析构函数。这里的~DisposableClass()析构函数的意义在于告诉GC你可以回收我Dispose(false)表示在GC回收的时候就不需要手动回收了。 虚方法Dispose(bool disposing) 1、通过此方法所有的托管和非托管资源都能被回收。参数disposing表示是否需要释放那些实现IDisposable接口的托管对象。 2、如果disposings设置为true就表示DisposablClass类依赖某些实现了IDisposable接口的托管对象可以通过这里的Dispose(bool disposing)方法调用这些托管对象的Dispose()方法进行回收。 3、如果disposings设置为false,就表示DisposableClass类依赖某些没有实现IDisposable的非托管资源那就把这些非托管资源对象设置为null等待GC调用DisposableClass类的析构函数把这些非托管资源进行回收。 4、另外以上把Dispose(bool disposing)方法设置为protected virtual的原因是希望有子类可以一起参与到垃圾回收逻辑的设计而且还不会影响到基类。 比如有这样的一个子类 C# 代码 复制 public class SubDisposableClass : DiposableClass{private bool _disposed; //表示是否已经被回收protected override void Dispose(bool disposing)
{if(!_disposed) //如果还没有被回收
{if(disposiing) //如果需要回收一些托管资源
{//TODO:回收托管资源调用IDisposable的Dispose()方法就可以}//TODO回收非托管资源把之设置为null等待CLR调用析构函数的时候回收_disposed true;}base.Dispose(disposing);//再调用父类的垃圾回收逻辑}
}五、IDisposable总结 当我们自定义的类及其业务逻辑中引用某些托管和非托管资源就需要实现IDisposable接口实现对这些资源对象的垃圾回收。 转载于:https://www.cnblogs.com/lasthelloworld/p/5011474.html