1、C#几乎所有对象都为托管对象,不同点是有的对象封装了非托管资源。

2、C#大部分对象在进行垃圾回收时都可以回收,包括非托管资源,因为非托管资源都已经通过C#类进行了封装,会将非托管资源的释放放在析构函数中,同时会实现IDipose接口。

3、IDipose作用是可以通过using手动提前释放,节约宝贵的资源。

4、在C#中,凡是继承了IDisposable接口的类,都可以使用using语句,从而在超出作用域后,让系统自动调用Dispose()方法。 一个资源安全的类,都实现了IDisposable接口和析构函数。提供手动释放资源和系统自动释放资源的双保险。

5、类似FileStream,会同时实现IDipose,及定义~FileStream(),~FileStream()作用是使用者没有调用IDipose,在GC回收时再回收非托管资源,否则非托管资源只有在程序停止之后才会释放。

析构函数只能由垃圾回收器调用。Despose()方法只能由类的使用者调用。

总结区分托管资源和非托管资源

(1)托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。

(2)非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源 等,这些资源一般情况下不存在于Heap(内存中用于存储对象实例的地方)中。

托管资源:从文字上看就是托付给别人管理,就像.NET的CLR,java的jvm

例子:

public class SourceManager : IDisposable
{
private bool disposed = false;
//非托管资源
private IntPtr handle;
//托管资源
FileStream fs = null;
public SourceManager()
{
} //由垃圾回收器调用,释放非托管资源
~SourceManager()
{
//GC调用,终结
Dispose(false);// 释放非托管资源
} //实现接口方法
//由类的使用者,在外部显示调用,释放类资源
public void Dispose()
{
Dispose(true);// 释放托管和非托管资源 //将对象从垃圾回收器链表中移除,
// 从而在垃圾回收器工作时,只释放托管资源,而不执行此对象的析构函数
GC.SuppressFinalize(this);
} //参数为true表示释放所有资源,只能由使用者调用
//参数为false表示释放非托管资源,只能由垃圾回收器自动调用
//如果子类有自己的非托管资源,可以重载这个函数,添加自己的非托管资源的释放
//但是要记住,重载此函数必须保证调用基类的版本,以保证基类的资源正常释放
protected virtual void Dispose(bool disposing)
{
// 如果资源未释放 这个判断主要用了防止对象被多次释放
if (!this.disposed)
{
if (disposing && fs != null)
{
// 释放托管资源
fs.Dispose();
} //释放非托管资源
//...
handle = IntPtr.Zero; disposed = true; // 标识此对象已释放
} }
}

C# 托管非托管资源释放的更多相关文章

  1. 托管非托管Dll动态调用

    原文:托管非托管Dll动态调用 最近经常看到有人问托管非托管Dll调用的问题.对于动态库的调用其实很简单.网上很多代码都实现了Dll的静态调用方法.我主要谈论下动态库的动态加载. 对于托管动态库,实现 ...

  2. .Net 程序在自定义位置查找托管/非托管 dll 的几种方法

    原文:.Net 程序在自定义位置查找托管/非托管 dll 的几种方法 一.自定义托管 dll 程序集的查找位置 目前(.Net4.7)能用的有2种: #define DEFAULT_IMPLEMENT ...

  3. C#的托管与非托管大难点

    托管代码与非托管代码 众所周知,我们正常编程所用的高级语言,是无法被计算机识别的.需要先将高级语言翻译为机器语言,才能被机器理解和运行.在标准C/C++中,编译过程是这样的:源代码首先经过预处理器,对 ...

  4. C#的三大难点之二:托管与非托管

    相关文章: C#的三大难点之前传:什么时候应该使用C#?​C#的三大难点之一:byte与char,string与StringBuilderC#的三大难点之二:托管与非托管C#的三大难点之三:消息与事件 ...

  5. C# 释放非托管资源

    C#中资源分为托管资源和非托管资源. 托管资源由垃圾回收器控制如何释放,不需要程序员过多的考虑(当然也程序员也可以自己释放). 非托管资源需要自己编写代码来释放.那么编写好的释放非托管资源的代码(释非 ...

  6. Office开发必备知识----为什么要释放非托管Com资源

    https://www.cnblogs.com/Charltsing/p/RealeaseComObject.html QQ:564955427 目前,国内Office插件开发的风头正盛,很多VBAe ...

  7. .net 资源释放(托管资源和非托管资源)

    1.托管资源 像int.float.DateTime等都是托管资源:net中80%的资源都是托管资源: 托管资源的回收通过GC(垃圾回收器)自动释放分配给该对象的内存,但无法预测进行垃圾回收的时间,我 ...

  8. 6.C# 释放非托管资源2

    C# 释放非托管资源 C#中资源分为托管资源和非托管资源. 托管资源由垃圾回收器控制如何释放,不需要程序员过多的考虑(当然也程序员也可以自己释放). 非托管资源需要自己编写代码来释放.那么编写好的释放 ...

  9. 5.C#释放非托管资源1

    释放非托管资源 在介绍释放非托管资源的时候,我觉得有必要先来认识一下啥叫非托管资源,既然有非托管资源,肯定有托管资源. 托管资源指的是.net可以自棕进行回收的资源,主要是指托管堆上分配的内存资源.托 ...

随机推荐

  1. 虚拟机实现finally语句块

    1.ret.jsr.jsr_w与returnAddress指令实现finally语句块 当class文件的版本号等于或高于51.0,jsr和jsr_w这两个操作码也不能出现在code数组中. 所有re ...

  2. MultipartFile的使用小结

    Multipartfile转File?File转MultipartFile?可千万别转晕了. 题图:from Google 1. MultipartFile类型转File类型 想要将Multipart ...

  3. Ubuntu双网卡不双待攻略

    特别不喜欢基于Windows的工作环境,这对一个Unix/Linux程序员来说,可以说是一种信仰.要不是电子邮件客户端被牢牢绑定在可恶的Outlook 2013上(因为加密邮件要求, 想使用Thund ...

  4. PTA (Advanced Level) 1040 Longest Symmetric String

    1040 Longest Symmetric String (25 分) Given a string, you are supposed to output the length of the lo ...

  5. 从java到web前端再到php,一路走来的小总结

    java的学习: 初学者对Java的学习,上来的感觉都是比较难,感觉java的东西很多,如此多的类和接口.有时还弄不懂为啥实例化出一个int空数组为什么数组中默认都是0,实例化一个空字符串数组时(St ...

  6. unity 和 iOS/Android 信息交互(方法调用)

    参考文章均来源于[大神雨松momo]的文章. unity -> iOS // unity 程序 usingSystem.Runtime.InteropServices; usingUnityEn ...

  7. WPF实现夜间模式

    背景 项目中设计了一个黑色主题,稍加改正也可作为夜间模式,效果图如下: 原理 由于项目中存在地图,而地图完全是由位图组成,不能直接改变背景色,所以我在内容上面放置了一个黑色的Border作为遮罩.可通 ...

  8. jenkins在Linux 下安装部署

      这里介绍两种方法,一种方法将最新版jenkins加入到yum源,另外一种是下载指定版本的rpm包 系统centos6 自带jdk1.7 一 安装jenkins wget -O :下载并以不同的文件 ...

  9. 实习小结(二)--- SSM框架搭建

    SSM项目框架搭建 前几天做了一个学生信息管理的项目,使用纯控制台输入,查询数据库,将信息在控制台中打印,功能完善得差不多之后,老师让将这个项目移植到Web中,使用Spring+SpringMVC+M ...

  10. 简易搭建git仓库、关联远程和本地仓库方法。克隆仓库方法。同一台电脑上创建两个git ssh key方法。

    一,在github上建仓库 react-js-antd-demo: 二:将远程仓库与本地仓库关联 git remote add origin git@github.com:begin256/react ...