C#释放托管资源简单描述

开发 后端
这里介绍在C#释放托管资源是可以自动通过"垃圾回收器"完成的(注意,"垃圾回收"机制是.NET Framework的特性,而不是C#的),但具体来说,仍有些需要注意的地方。

学习C#语言时,经常会遇到C#释放托管资源问题,这里将介绍C#释放托管资源问题的解决方法。

在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理.  (了解更多区别请参阅.NET Framework或C#的高级编程资料)

托管资源在.NET Framework中又分别存放在两种地方: "堆栈"和"托管堆"(以下简称"堆");规则是,所有的值类型(包括引用和对象实例)和引用类型的引用都存放在"堆栈"中,而所有引用所代表的对象实例都保存在堆中.

在C#释放托管资源是可以自动通过"垃圾回收器"完成的(注意,"垃圾回收"机制是.NET Framework的特性,而不是C#的),但具体来说,仍有些需要注意的地方:

1.值类型(包括引用和对象实例)和引用类型的引用其实是不需要什么"垃圾回收器"来释放内存的,因为当它们出了作用域后会自动释放所占内存(因为它们都保存在"堆栈"中,学过数据结构可知这是一种先进后出的结构);

2.只有引用类型的引用所指向的对象实例才保存在"堆"中,而堆因为是一个自由存储空间,所以它并没有像"堆栈"那样有生存期("堆栈"的元素弹出后就代表生存期结束,也就代表释放了内存),并且非常要注意的是,"垃圾回收器"只对这块区域起作用;

3."垃圾回收器"也许并不像许多人想象的一样会立即执行(当堆中的资源需要释放时),而是在引用类型的引用被删除和它在"堆"中的对象实例被删除中间有个间隔,为什么呢? 因为"垃圾回收器"的调用是比较消耗系统资源的,因此不可能经常被调用!

(当然,用户代码可以用方法System.GC.Collect()来强制执行"垃圾回收器")

然而,大多数情况下,我们需要明确地在不执行"垃圾回收器"的情况下C#释放托管资源(因为只需要释放一部分但又是非常需要释放的资源,但***不要调用"垃圾回收器",因为"垃圾回收器"太浪费系统资源了),或需要释放"非托管资源",这时候我们该怎么办? 这是我们写代码的时候必须要考虑的问题("垃圾回收器"是系统自动实现的,一般情况不需要用户干预),否则Windows系统会因为内存耗尽而...

现在,我来告诉怎么办,那就是使用类的Dispose()方法释放所有类型资源 和 使用析构方法释放非托管资源!

【编辑推荐】

  1. C#文法产生式概述
  2. C#类型声明简单分析
  3. C#命名空间和程序集学习笔记
  4. 利用C#清空回收站学习经验
  5. C# Color枚举简单描述
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-19 10:25:18

C#托管资源

2009-08-31 18:32:01

C# ListBoxE

2009-08-19 10:09:21

C#和C++

2009-09-07 15:31:49

C#支持事件

2009-08-27 10:01:52

C#自动属性

2009-08-20 16:45:03

C#哈希值

2009-09-03 16:55:58

C#引用类型

2009-09-01 17:08:35

C# Color枚举

2009-08-21 17:31:58

C#垃圾回收

2009-09-02 13:01:11

C#多路广播

2009-09-16 09:01:40

C#多维数组

2009-08-28 09:30:48

C#命名属性

2009-09-01 18:25:32

C#结构实例

2009-09-07 14:33:02

C# switch语句

2009-08-13 17:58:34

C#存储过程

2009-09-03 10:19:12

C#表单控件

2009-08-31 17:53:20

C#实现索引器

2009-09-17 16:28:27

C#参差数组

2009-09-02 17:38:16

C#泛型支持

2009-08-26 14:54:23

C# new和over
点赞
收藏

51CTO技术栈公众号