IDisposable接口
提供一种用于释放非托管资源的机制。特别说明:托管资源一般有Framework自动释放,所以该接口的主要目的是用来处理非托管资源的释放。若要浏览此类型的.NETFramework源代码,请参阅引用源。
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#托管资源与非托管资源
文章为作者独立观点,不代表股票交易接口观点