一、IDisposable 接口
提供一种用于释放非托管资源的机制。
特别说明:托管资源一般有Framework自动释放,所以该接口的主要目的是用来处理非托管资源的释放。
若要浏览此类型的 .NET Framework 源代码,请参阅引用源。
程序集: 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<Car> carList { get; set; }
~Student()
{
Dispose(false); //手动释放非托管资源
Console.WriteLine($"Student对象被释放,StuID={StuID}");
}
public Student()
{
carList = new List<GC_Test.Car>();
for (int i = 0; i < 5; i++)
{
carList.Add(new Car() { CarID = i });
}
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
//释放托管资源
carList = null;
}
//释放非托管资源,省略
//.......
}
/// <summary>
/// 外部调用释放托管和非托管资源
/// </summary>
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();
}
更多: