C#IDisposable 接口资源释放
一、IDisposable 接口
提供一种用于释放非托管资源的机制。
特别说明:托管资源一般有Framework自动释放,所以该接口的主要目的是用来处理非托管资源的释放。
若要浏览此类型的 .NET Framework 源代码,请参阅引用源。
命名空间: System程序集: mscorlib(位于 mscorlib.dll)
[ComVisibleAttribute(true)]
public interface IDisposable
Dispose()
执行与释放或重置非托管资源关联的应用程序定义的任务。
常用场景模板实例:
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();
}
更多:
C# using 关键字使用整理
C#析构函数
C# 托管资源 与 非托管资源
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
