当前位置: 首页 > article >正文

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
}

http://www.kler.cn/news/161900.html

相关文章:

  • 我不是DBA之慢SQL诊断方式
  • 云原生之深入解析Kubernetes策略引擎对比:OPA/Gatekeeper与Kyverno
  • 【React】路由的基础使用
  • SpringAOP专栏一《使用教程篇》
  • 学习Opencv(蝴蝶书/C++)相关1——4.图形和大型数组类型
  • Java String相关问题
  • StringBoot常用注解(不断添加)
  • ncnn模型部署——使用VS2019把项目打包成DLL文件
  • 【头歌实训】分布式文件系统 HDFS
  • 火狐,要完了!
  • GateWay网关介绍以及整合knife4j聚合所有服务的接口文档
  • pymol使用
  • EI级 | Matlab实现TCN-GRU-Multihead-Attention多头注意力机制多变量时间序列预测
  • TE发布最新TC Policy 3.1
  • 单片机第三季-第四课:STM32下载、MDK和调试器
  • 网站建设app开发小程序制作|企业软件定制
  • 有爱的冬天不再冷——壹基金儿童温暖包抵达富平
  • Kubernetes(K8s)Pod控制器详解-06
  • Java的List中的各种浅拷贝和深拷贝问题
  • 超大规模集成电路设计----FPGA时序模型及FSM的设计(八)
  • 查看端口号是否被占用
  • 指针数组和数组指针作为形式参数
  • SmartChart:一站式数据可视化解决方案
  • SpringBoot:SpringMVC(上)
  • 2023-12-04 AIGC-Stable Diffusion和SadTalker-搭建及使用
  • Linux_CentOS_7.9 VNC安装卸载以及相关配置开机自启动服务简易记录
  • 字符串排序
  • 【华为数据之道学习笔记】3-2 基础数据治理
  • JavaEE之多线程编程(一):基础篇
  • 手机升级到iOS15.8后无法在xcode(14.2)上真机调试