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

C#中对象的销毁有三种方式Finalize,Dispose,GC。

为什么80%的码农都做不了架构师?>>>   hot3.png

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方法能够被调用到,确保可以手动释放任何需要释放的资源。

转载于:https://my.oschina.net/haoye/blog/519107

相关文章:

  • shrio教程初级(八)shiro验证码与记住登录
  • 转载blog_Linux下Tomcat日志定期清理 及 logrotate 配置
  • Android Fragment间对象传递
  • windows下sublime text的node.js开发环境搭建
  • 关于PHP设计模式的分析和理解
  • ibatis设置启用及关闭命名空间
  • struts1和struts2的区别对比
  • HA集群之三:corosync+pacemaker实现httpd服务的高可用(crm的用法)
  • VmWare10 32位安装CentOS7遇到的问题及解决办法
  • 百度地图查询数据结果
  • AngularJs angular.element
  • CUDA学习笔记(五)
  • JVM探索(二)
  • Android布局
  • BootstrapValidator验证表单用法
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • CODING 缺陷管理功能正式开始公测
  • Docker 笔记(2):Dockerfile
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript实现分页效果
  • Java比较器对数组,集合排序
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • maya建模与骨骼动画快速实现人工鱼
  • PHP CLI应用的调试原理
  • Wamp集成环境 添加PHP的新版本
  • 从setTimeout-setInterval看JS线程
  • 理解在java “”i=i++;”所发生的事情
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 区块链技术特点之去中心化特性
  • 新版博客前端前瞻
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 阿里云服务器购买完整流程
  • #### go map 底层结构 ####
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (20050108)又读《平凡的世界》
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C)一些题4
  • (pojstep1.1.2)2654(直叙式模拟)
  • (六)软件测试分工
  • (一)VirtualBox安装增强功能
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)甲方乙方——赵民谈找工作
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转载)hibernate缓存
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .gitignore
  • .NET 8.0 中有哪些新的变化?
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net 反编译_.net反编译的相关问题
  • .Net多线程总结
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)