首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[整理贴]托管代码/非托管代码及托管资源/非托管资源的扫盲帖,该如何解决

2012-02-29 
[整理贴]托管代码/非托管代码及托管资源/非托管资源的扫盲帖说明:刚刚回了一个帖子,有人问是不是所有的类

[整理贴]托管代码/非托管代码及托管资源/非托管资源的扫盲帖
说明:刚刚回了一个帖子,有人问是不是所有的类在不用时调用Dispose()方法就能及时释放内存,感觉好像以前也有朋友问过我这样的问题,于是将网上的资料结合个人理解整理了一下,作为一个托管代码/非托管代码及托管资源/非托管资源的扫盲帖吧。
==============================================================================================================
 托管代码 (managed code) 
由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。 

  在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。


非托管代码 (unmanaged code)

  在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。 

.net中托管代码的含义

问题:什么是托管?托管是什么意思?

托管代码就是基于.net元数据格式的代码,运行于.net平台之上,所有的与操作系统的交换有.net来完成,就像是把这些功能委托给.net,所以称之为托管代码。非托管代码则反之。
==============================================================================================================
托管资源

与托管代码密切相关的是托管资源。托管资源是由公共语言运行的垃圾回收器进行分配和释放的数据。默认情况下,C#、Visual Basic 和 JScript.NET 数据是托管资源。不过,通过使用特殊的关键字,C# 数据可以被标记为非托管资源。Visual C++数据在默认情况下是非托管数据,即使在使用 /CLR 开关时也不是托管的。

关于托管资源,就不用说了撒,像简单的int,string,float,DateTime等等,.net中超过80%的资源都是托管资源。

非托管资源
 对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,否则会占用系统的内存和资源,而且可能会出现意想不到的错误。

最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果在MSDN Library 中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 等等资源。可能在使用的时候很多都没有注意到!

在.NET中很多托管资源都实现了IDisposable接口,这个接口只有一个待实现的方法Dispose(),在上面提到的类中大都有这个方法,此外还有些类除了调用Dispose()方法可以释放资源之外,还可以调用Close()方法释放资源,比如各类数据库连接(Connection)、各种流(Stream),在调用Close()方法时会自动调用Dispose()方法的。

[解决办法]
bd
[解决办法]
搬条凳子慢慢看
[解决办法]
学习了
[解决办法]
顶,学习了。
[解决办法]
感谢楼主 学习了~
[解决办法]
up
[解决办法]
学习!
[解决办法]
写的很棒
[解决办法]
不错不错!学习啦
[解决办法]
赶紧占座
写得真是详细啊!3Q!
[解决办法]
搬个凳子来学习……
[解决办法]
好长啊~~~~~
[解决办法]
还看过LZ的视屏教程,讲的很好啊
[解决办法]
了解
[解决办法]


学习,顺便JF。
[解决办法]
在《你必须知道的.NET》中了解过了。
[解决办法]
学过com+ , 这些都比较好理解....
[解决办法]
再学习
[解决办法]
经典讲解,不顶不行
[解决办法]
mark
[解决办法]
顶老周,机器里你的《夜话。。。》还没看完呢,哈哈哈,找个时间继续~
[解决办法]
谢谢楼主分享
[解决办法]
up
[解决办法]
转到资料库 学习
[解决办法]
mark
[解决办法]
编译以后一样吗?
[解决办法]
up
[解决办法]
up
周公
[解决办法]
up
[解决办法]

探讨
up
周公

[解决办法]
探讨
搬条凳子慢慢看

[解决办法]
Thank You LZ
[解决办法]
.
[解决办法]
直接收藏了
[解决办法]
up
[解决办法]
收藏了!
[解决办法]
学习!
[解决办法]
写得不错 牛人 学习
[解决办法]
支持扫盲!
[解决办法]
谢谢楼主
[解决办法]
謝謝!
[解决办法]
探讨
引用:
赶紧占座
写得真是详细啊!3Q!

关于什么资源该要释放,什么样可以不用管,Finallize()/Dispose()/Close()等方法的区别,我刚开始学的时候也迷惑了相当长一段时间的。

[解决办法]
连同我一起扫了吧~~
[解决办法]
学习了 楼主伟大 知识共享 带动全社会的进步啊
[解决办法]
学习~
[解决办法]
jf
[解决办法]
TAG!
------解决方案--------------------


很强大...学习了.
[解决办法]
up !
[解决办法]
学习
[解决办法]
mark
[解决办法]
Mark!
[解决办法]
Mark
[解决办法]
up
[解决办法]
学习…………
[解决办法]
mark
[解决办法]
低调路过~~~
[解决办法]
学习
[解决办法]

[解决办法]
谢谢分享
[解决办法]
搞人啊 这里有搞人
[解决办法]
先谢谢了
[解决办法]
学习了,,JF去赌博压宝。。。
[解决办法]
學習!!
[解决办法]
学习~
[解决办法]
非常好的资料,收藏了。
[解决办法]
Mark!
[解决办法]
这叫扫盲呀...
我的定义: 目前的来看, 开发的相同的程序运行慢的都叫托管代码, 运行快的叫非托管代码
[解决办法]
Up学习了
[解决办法]
good
[解决办法]
mark
[解决办法]
留标记
[解决办法]
学习。谢谢!
[解决办法]
up,学习了
[解决办法]
终于看完了,又学到了
[解决办法]
学习了
[解决办法]
mark
[解决办法]
顶,学习了。
[解决办法]


[解决办法]
学习啦~~~~~~~~~
[解决办法]
收藏
[解决办法]
学习了,谢谢!
[解决办法]
学习ING
------解决方案--------------------


收藏接分
[解决办法]
学习了
[解决办法]
学习~!!!!!
[解决办法]
收藏了
[解决办法]
收藏。。。慢慢学习!

热点排行