C#-using处理非托管资源

2023-12-15 09:28:20

方式一:声明一个析构函数(或终结器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
}

文章来源:https://blog.csdn.net/rwo_bear/article/details/135008476
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。