C# 托管资源与非托管资源

在.net 编程环境中,系统的资源分为托管资源和非托管资源。

托管资源:
Net平台中,CLR为程序员提供了一种很好的内存管理机制,使得程序员在编写代码时不要显式的去释放自己使用的内存资源(这些在先前C和C++中是需要程序员自己去显式的释放的)。这种管理机制称为GC(garbage collection)。GC的作用是很明显的,当系统内存资源匮乏时,它就会被激发,然后自动的去释放那些没有被使用的托管资源(也就是程序员没有显式释放的对象)。
所以托管就是.net framework 负责帮你管理内存及资源释放,不需要自己控制,当然对象只针对托管资源(部分引用类型), 不回收非托管资源。 像数组,用户定义的类、接口、委托,object,字符串等引用类型,栈上保存着一个地址而已,当栈释放后, 即使对象已经没有用了,但堆上分配的内存还在,只能等GC收集时才能真正释放 ;但注意int,string,float,DateTime之类的值类型,GC会自动释放他们占用的内存,不需要GC来回收释放
那么非托管的资源怎么释放回收呢?
非托管资源: 
对于非托管资源,GC只能跟踪非托管资源的生存期,而不知道如何去释放它。这样就会出现当资源用尽时就不能提供资源能够提供的服务,windows的运行速度就会变慢。比如当你链接了数据库,用完后你没有显式的释放数据库资源,如果还是不断的申请数据库资源,那么到一定时候程序就会抛出一个异常。

所以,当我们在类中封装了对非托管资源的操作时,我们就需要显式,或者是隐式的释放这些资源在.Net中释放非托管资源主要有2种方式,Dispose,Finalize,而Finalize和Dispose方法分别就是隐式和显式操作中分别使用到的方法。
例如文件流,数据库的连接,系统的窗口句柄,打印机资源等等,当你读取文件之后,就需要对各种Stream进行Dispose等操作。比如 SqlDataReader 读取数据完毕之后,需要 reader.Dispose();等
Finalize一般情况下用于基类不带close方法或者不带Dispose显式方法的类,也就是说,在Finalize过程中我们需要隐式的去实现非托管资源的释放,然后系统会在Finalize过程完成后,自己的去释放托管资源。在.NET中应该尽可能的少用析构函数释放资源,MSDN2上有这样一段话:实现 Finalize 方法或析构函数对性能可能会有负面影响,因此应避免不必要地使用它们。用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收。所以有析构函数的对象,需要两次,第一次调用析构函数,第二次删除对象。而且在析构函数中包含大量的释放资源代码,会降低垃圾回收器的工作效率,影响性能。所以对于包含非托管资源的对象,最好及时的调用Dispose()方法来回收资源,而不是依赖垃圾回收器。
转载自  https://www.cnblogs.com/enamorbreeze/p/4711468.html

转载于:https://www.cnblogs.com/LagoOrLY/p/10307347.html

C# 托管资源与非托管资源相关推荐

  1. C# 托管资源和非托管资源

    原文地址:http://blog.csdn.net/zlwzlwzlw/article/details/7918633 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托 ...

  2. C# 托管资源和非托管资源(Dispose、析构函数)

    https://www.cnblogs.com/herenzhiming/articles/9691524.html 资源分类: 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内 ...

  3. 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...

    建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源. 提供给调用者调用 ...

  4. 托管资源和非托管资源

    在.net 编程环境中,系统的资源分为托管资源和非托管资源. 对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作.也就是说对 ...

  5. .NET中的托管资源与非托管资源

    托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收. 非托管资源指的是.NET不知道如何回 ...

  6. C#Maeshal类——托管资源和非托管资源转换

    C#--Marshal.StructureToPtr方法简介 http://blog.csdn.net/livelylittlefish/article/details/2423764         ...

  7. 关于Dll、Com组件、托管dll和非托管dll的理解

    Com组件和dll区别: 1.普通dll不能通过regsvr32.exe来注册,而Com组件能通过regsvr32.exe注册. 2.Com组件是微软的一个协议,满足com组件协议的dll文件就是co ...

  8. crm 系统解决方案_如何将本地CRM组织的托管解决方案转换为非托管解决方案?...

    crm 系统解决方案 Solution is very important part of Dynamics CRM. In order to deploy your customization, s ...

  9. C# 托管内存与非托管内存之间的转换

    C# 托管内存与非托管内存之间的转换 c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我 ...

最新文章

  1. 大学计算机专业副修课,计算机学院举行本科课程教学大纲修订工作研讨会
  2. 如何做好网络推广浅析新手对网站SEO内链该如何优化?
  3. 小麦盒子cdn_阿里云CDN入门使用配置
  4. 你真的会玩SQL吗?和平大使 内连接、外连接
  5. c语言打印菱形_没事了,搞一下C语言打印大小可变的菱形图案?
  6. dual mysql 获取序列_MySQL获取周、月、天日期,生成排序号
  7. grpc入门到精通_Spring Cloud 从入门到精通(一)Nacos 服务中心初探
  8. BSD:Berkeley Software Distribution,伯克利软件套件
  9. Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
  10. 万能的林萧说:我来告诉你,一个草根程序员如何进入BAT。 - 今日头条(www.toutiao.com)...
  11. 百度怎么进行模糊搜索_怎么在百度上准确搜索,提高10倍效率?
  12. 伽玛校正(Gamma Correction)
  13. 我对“渗透性测试”的理解
  14. 条件表达式a?b:c是什么意思
  15. cpu第几代计算机,怎么看cpu是几代的,来看看你的CPU是几代的?
  16. system32 下exe文件的作用
  17. mysql配置报错thread_MySQL错误Forcing close of thread的两种解决方法
  18. 【HTML5】Web前端——第三课:HTML5 表单相关元素和属性
  19. 【程序员才懂的梗】全程高能 爆笑硬核 你中了几个 | 程序员的日常 搞笑瞬间
  20. 2019校园招聘深信服数组翻转题

热门文章

  1. Bootstrap学习(二)
  2. 用canvas给自己的博客园加背景(二)
  3. 20145236 《Java程序设计》 第6周学习总结
  4. 实现OO的最后一公里
  5. 微擎url模式解读_微擎系统全局变量说明 - 微擎(WEIQING) – 黑锐源码社区 – bbs.heirui.cn...
  6. (71)FPGA面试题-使用不同的代码实现2-4译码器?使用case语句
  7. (87)FPGA读文件激励(readmemb)
  8. (35)FPGA面试题FPGA工程师努力的方向
  9. (5)FPGA面试技能提升篇(SDK开发环境)
  10. vue 复制 长按_Vue