C#-using处理非托管资源
using处理非托管资源
方式一:声明一个析构函数(或终结器finalizer)作为类的成员;
C#中,析构函数在底层.NET体系结构中为终结器,编译器会隐式的把析构函数编译成等价于重写Finalize()方法的代码,如下:
protected override void Finalize()
{
try
{
//Finalizer implementation
}
finally
{
base.Finalize();
}
}
方式二:实现IDisposable或IAsyncDisposable接口;
C#中,推荐使用该方式替代析构函数,这些接口定义了一种模具(具有语言级的支持),该模式为释放非托管的资源提供了确定的机制,并避免产生析构函数固有的与GC相关的问题;
注意:若处理过程中出现异常则不会释放,通常在finally块中释放,如下:
People people = null;
try
{
people = new();
//other process
}
finally
{
people.Dispose();
}
class People : IDisposable
{
public void Dispose()
{
//implementation
}
}
方式三:using语句和using声明(推荐),实现了对方式二的封装;
用于实现IDisposable接口的对象,当对象的引用超出作用域时,自动调用该对象的Dispose()或DisposeAsync()方法,如下示例,会生成与上面try块等价的IL代码;
using (People people = new())
{
//other process
}