本文共 2114 字,大约阅读时间需要 7 分钟。
一、IDisposable 接口
提供一种用于释放非托管资源的机制。
特别说明:托管资源一般有Framework自动释放,所以该接口的主要目的是用来处理非托管资源的释放。
若要浏览此类型的 .NET Framework 源代码,请参阅。
[ComVisibleAttribute(true)]public interface IDisposable
执行与释放或重置非托管资源关联的应用程序定义的任务。
public class Foo : IDisposable{ private bool disposed = false; //既释放托管资源,又释放非托管资源 public void Dispose() { Dispose(true); //将对象从垃圾回收器链表中移除, //从而在垃圾回收器工作时,只回收托管资源,而不执行对象的析构函数 GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { //释放托管资源 } // 释放非托管资源 disposed = true; } } //析构函数不是人工调用,由垃圾回收器调用,用于释放非托管资源 ~Foo() { Dispose(false); }}二、继承了IDisposable 接口的类,可以使用using {} 块自动释放处理
三、验证实例,释放托管或非托管实例
class Student : IDisposable{ public int StuID { get; set; } public List验证代码一:carList { get; set; } ~Student() { Dispose(false); //手动释放非托管资源 Console.WriteLine($"Student对象被释放,StuID={StuID}"); } public Student() { carList = new List (); for (int i = 0; i < 5; i++) { carList.Add(new Car() { CarID = i }); } } protected virtual void Dispose(bool disposing) { if (disposing) { //释放托管资源 carList = null; } //释放非托管资源,省略 //....... } /// /// 外部调用释放托管和非托管资源 /// public void Dispose() { this.Dispose(true); //请求公共语言运行时不要调用指定对象的终结器。 GC.SuppressFinalize(this); }}
static void TestThree(){ // using(){} 语句块,自动调用Dispose() using (Student stu = new Student() { StuID = 2 }) { Console.WriteLine("释放之前》"); Console.WriteLine(stu == null); } //清空处理 GC.Collect();}验证代码二:
static void TestTwo(){ Student stu = new Student() { StuID = 2 }; Console.WriteLine("释放之前》"); Console.WriteLine(stu == null); //释放资源 stu.Dispose(); int id = stu.StuID; Console.WriteLine(stu == null); //清空处理 GC.Collect();}
更多:
转载地址:http://znogi.baihongyu.com/