关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

C#中对象的销毁的三种方法

发布时间:2020-02-14 18:38:44

1、Finalize方法(C#中是析构函数,以下称析构函数)是用于释放非托管资源的,而托管资源会由GC自动回收。所以,我们也可以这样来区分托管和非托管资源。所有会由GC自动回收的资源,就是托管的资源,而不能由GC自动回收的资源,就是非托管资源。在我们的类中直接使用非托管资源的情况很少,所以基本上不用我们写析构函数。


2、大部分的非托管资源会给系统带来很多负面影响,例如数据库连接不被释放就可能导致连接池中的可用数据库连接用尽。文件不关闭会导致其它进程无法读写这个文件等等。


实现模型:

1、由于大多数的非托管资源都要求可以手动释放,所以,我们应该专门为释放非托管资源公开一个方法。实现IDispose接口的Dispose方法是最好的模型,因为C#支持using语句快,可以在离开语句块时自动调用Dispose方法。


2、虽然可以手动释放非托管资源,我们仍然要在析构函数中释放非托管资源,这样才是安全的应用程序。否则如果因为程序员的疏忽忘记了手动释放非托管资源,那么就会带来灾难性的后果。所以说在析构函数中释放非托管资源,是一种补救的措施,至少对于大多数类来说是如此。


3、由于析构函数的调用将导致GC对对象回收的效率降低,所以如果已经完成了析构函数该干的事情(例如释放非托管资源),就应当使用SuppressFinalize方法告诉GC不需要再执行某个对象的析构函数。


4、析构函数中只能释放非托管资源而不能对任何托管的对象/资源进行操作。因为你无法预测析构函数的运行时机,所以,当析构函数被执行的时候,也许你进行操作的托管资源已经被释放了。这样将导致严重的后果。


5、(这是一个规则)如果一个类拥有一个实现了IDispose接口类型的成员,并创建(注意是创建,而不是接收,必须是由类自己创建)它的实例对象,则这个类也应该实现IDispose接口,并在Dispose方法中调用所有实现了IDispose接口的成员的Dispose方法。

只有这样的才能保证所有实现了IDispose接口的类的对象的Dispose方法能够被调用到,确保可以手动释放任何需要释放的资源。



相关阅读

云南医院网站建设的基本原则云南物流网站建设中更有利后期发展的几个重点云南建设移动网站的意义云南个人网站开发步骤云南手机网站建设价格明细云南与商城网站建设费用有关的因素云南电子商务网站的建设要点云南网站建设的规划应该有那些环节云南购物网站设计需求云南详细介绍站内的四种链接C#中有关于Split使用方面的代码实例如下C#中如何读取XML文件的代码方法关于c#son<--1-->的代码文件详细解析mysql数据库中特殊条件查询语句如下SQL数据库相关知识分享objective-C中的字符串拼接方法分享JS正则表达式详细解析云南如何保证企业网站的安全云南网站页脚设计的小技巧云南七个非常实用的网站排版建议云南文字排版在网站设计中的运用云南网站的测试流程有哪些云南网站设计底部应该有哪些内容云南建设APP时的注意事项云南企业网站建设完成之后的流程是什么云南移动网站建设的重点:云南优质手机网站需要具备那些条件代码注释的几种写法微信支付集成构建步骤错误代码集合的解决方法JS的正则表达式SQL 常用的语句C# 实现扫码二维码登录的难点讲解C#面对对象的资料库心得分享$jQuery 源码解析动画模块 便捷动画详解头部布局搜索验证和AJAX自动搜索提示并封装成组件提高代码复用性前端开发之学习CSS之用CSS实现时钟效果树莓派2_3点亮LED灯需要几行代码3行小孩子都能学会List集合去重各种方式汇总数据请说话css3新增边框阴影边框背景文本字体JavaScript之DOM基础css常用元素通用样式表vuex知识笔记及与localStorage和sessionStorage的区别js-JavaScript中数组和对象的遍历方法总结用正则的方法验证ipv4地址html制作一个照片墙的方法萌娘百科上的黑幕实现编程开发那些事?进程、线程、协程编程开发那些事 注解(Annotation)基于 H5 Canvas 及 3D 组态实现楼宇新风系统推送技术 ajax轮询 WebSocket以及socketIO的使用从实战角度超级详解中大型企业微服务化的六大核心关键技术Java 如何 添加、读取、删除Excel图片?Angular 从入坑到挖坑RX.js6变化前端菜鸟面试知识梳理有一定作用css如何改变css伪元素的样式css中元素显示方式实测vue 路由过渡动效揭秘阿里、腾讯、字节跳动在家办公的区别Linux下使用Tomcat6_Tomcat72020年学 Python 还有价值吗?这 100 道 Python 题,拿去刷c++ 的变量和基本类型微服务架构Sleuth(zipkin) 服务链路追踪php数据库嵌套查询之mongodb中进行嵌套查询package com.hhh.quartz;import org.quartz定时任务Quartz入门Mybatis缓存源码阅读java高并发-从源码角度分析创建线程池究竟有哪些方式物联网开发Thingsboard之MQTT设备协议简介Ubuntu安装软件时报 Unable to acquire the dpkg frontend lock解决方案Python2.7_3.5_3.6_3.7_3.8 使用OS模块调用 cmdlinux中安装msql2017 linux 使用Docker 部署mssql 2017.net core 轻量级容器 ServiceProvider 源码分析ASP.NET MVC——CodeFirst开发模式C#制作Wincc组件进行配方管理多线程实现的那些方法asp.net C#解释器模式.net core 3 web api 报404错误2020 年 中国.NET开发者调查报告Winfrom 减少控件重绘闪烁的方法WPF 自定义控件在MenuItem上使用RadioButtonOAuth2.0 QQ 授权认证 IdentityServer4vs2019 asp.net core 3.x 授权中的概念asp.net C#后台异步消息队列实现HTTP协议-Request&Responseselenium获取缓存数据R语言入门:向量初探几个点认识Nginx服务器React Native集成声网Agora语音通讯Django复制记录的方法Django中更新多个对象数据与删除对象的方法Django如何连接mysqlRedis5.x两种持久化方式以及主从复制配置基于SSM开发学生信息管理系统源码TomCat控制台中文乱码及IDEA设置为UTF为spring cloud config实现刷新动态掉的坑git常用命令python3-cookbook-python3apache-maven-3.6.2-配置Maven环境
/template/Home/Zkeys/PC/Static