非托管资源的释放

1、基础知识准备:
 
C#中的数据类型分为两种:值类型(int,char,double等)和引用类型(数组,用户自定义类型(包括类,接口,委托),object,字符串),对应也就有值类型的变量和引用类型的变量;面向对象编程中,简单数据类型是存放值的变量,这种变量关心的是值,因而称为值类型,另外,C#在堆(Heap)中创建和维护对象(一般是类),程序使用对象的存储地址来引用这个对象,这类用来保存地址的变量被称为引用类型变量;一个程序运行时,变量主要存放在“堆”和“栈”中,“栈”中主要用于存放“子函数的临时变量,局部变量”,“堆”中主要用于存放“全局变量,静态变量,new产生的变量”,托管资源主要研究的是“堆中的变量”吧
 
2、对“托管资源”的理解?
 
托管即托付管理,.Net中时托付给CLR(Common Language Runtime—公共语言运行时)管理(注:CLR提供内存管理机制GC-garbage collection);
 
资源指的是系统内存空间,可以是程序中建立的对象,作用域内的变量等;
 
托管资源合起来就是指被CLR控制的内存空间(资源),这些资源的分配与释放可由CLR完成,因而减轻程序员的负担;
 
3、“非托管资源”:不属于CLR管理(分配和释放内存),主要包括文件流、数据库的连接,COM对象,打印机资源等等;
 
4、“托管资源”与“非托管资源”的释放?
 
托管资源的释放由GC完成,非托管资源的释放有两种方法:
 
(1)实现protected void Finalize()来释放,因为GC在释放对象时会检查该对象是否实现了Finalize()方法,如果是则调用它,但这样会降低效率;
 
(2)通过实现一个接口显式地提供给客户端手工释放对象的方法,而不是等着GC来释放:System 命名空间内有一个 IDisposable 接口,拿

原文地址:https://www.cnblogs.com/syf/p/2998051.html