托管资源和非托管资源(C# 托管资源与非托管资源)

本文目录
- C# 托管资源与非托管资源
- c#托管是怎么一回事,能详细解答
- 请教一下,什么事托管资源,什么事非托管资源可否从最基础的概念上讲解一下
- c#什么是托管资源与什么是非托管资源
- 个人档案托管和不托管的区别
- C#中使用托管资源和非托管资源的区别,以
- 请详细介绍一下在C#语言中什么是“非托管资源”,什么是“托管资源”
C# 托管资源与非托管资源
我是这样理解的:可以由系统自动回收的资源就叫托管资源,不能自动回收的叫非托管资源。
比如C++的资源都是非托管 ,因为你要自己写析构函数来释放资源。
C# 中引入了类似 Java的gc功能,即垃圾自动回收。所以所以你写的方法就不用自己写析构了,系统会自动回收不再使用的资源。C# 中 的飞托管资源 是由于程序员 引入了 不安全的代码 或代码段,CLR 无法验证其安全性,也就无法托管。比如 在unsafe 下的代码或代码段 都是非托管的。
期待更明了的解释···
c#托管是怎么一回事,能详细解答
在.net 编程环境中,系统的资源分为托管资源和非托管资源。
对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的
只是了解.net CLR如何做这些操作。也就是说对于您的应用程序创建的大多数对象,可以依靠 .NET
Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。
对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如
System.IO.StreamReader的一个文件对象,必须显示的调用对象的Close()方法关闭它,否则会占用系统
的内存和资源,而且可能会出现意想不到的错误。
我想说到这里,一定要清楚什么是托管资源,什么是非托管资源了?
最常见的一类非托管资源就是包装操作系统资源的对象,例如文件,窗口或网络连接,对于这类资源
虽然垃圾回收器可以跟踪封装非托管资源的对象的生存期,但它不了解具体如何清理这些资源。还好.net
Framework提供了Finalize()方法,它允许在垃圾回收器回收该类资源时,适当的清理非托管资源。如果
在MSDN Library 中搜索Finalize将会发现很多类似的主题,这里列举几种常见的非托管资源:
ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Fon
t,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Time
r,Tooltip 等等资源。可能在使用的时候很多都没有注意到!
关于托管资源,就不用说了撒,像简单的int,string,float,DateTime等等,.net中超过80%的资源都是托
管资源。
非托管资源如何释放,.NET Framework 提供 Object.Finalize 方法,它允许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源。默认情况下,Finalize 方法不执行任何操作。如果您要让垃圾回收器在回收对象的内存之前对对象执行清理操作,您必须在类中重写 Finalize 方法。然而大家都可以发现在实际的编程中根本无法override方法Finalize(),在C#中,可以通过析构函数自动生成 Finalize 方法和对基类的 Finalize 方法的调用。
例如:
~MyClass()
{
// Perform some cleanup operations here.
}
该代码隐式翻译为下面的代码。
protectedoverridevoid Finalize()
{
try
{
// Perform some cleanup operations here.
}
finally
{
base.Finalize();
}
}
但是,在编程中,并不建议进行override方法Finalize(),因为,实现 Finalize 方法或析构函数对性能
可能会有负面影响。一个简单的理由如下:用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收
,当垃圾回收器回收时,它只回收没有终结器(Finalize方法)的不可访问的内存,这时他不能回收具有终
结器(Finalize方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记
为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收
器进行回收时,就回收并释放了这些内存。
请教一下,什么事托管资源,什么事非托管资源可否从最基础的概念上讲解一下
托管资源和非托管资源这个要从内存回收上来讲,首先一个点很明确:托管资源,.net垃圾回收器自动回收,非托管资源,垃圾回收期没法自动回收;
另外一点,托管资源由.net核心管理创建,非托管资源是由.net核心调用其他的接口创建,.net无法控制,例如active控件,画笔、画刷。这些都是.Net调用系统接口创建的,它管不着,只能由用户自已释放。
最后,.Net内核封装了的,能够或者有权限自动释放的就是托管资源;如果是.Net调用外部资源,无法自动释放的就是非托管资源。
c#什么是托管资源与什么是非托管资源
托管资源:你可以理解为.NET平台框架自身的资源。
非托管资源:就是非.NET平台框架的资源,比如,连接数据库,操作Office等.NET里的平台互操作都是非托管资源。这些资源用完都要立即释放掉的。
个人档案托管和不托管的区别
托管个人档案可以让我们的个人档案正常流转,而不办理个人档案托管,就意味着我们的个人档案资料已经全部作废,在工作中是需要进行档案使用的,所以我们需要把自己的个人档案托管到正规的地方,这样才能够保证档案的合法效力。
如果目前并没有参加工作,那么你的档案也是需要托管的,因为你以后在办理落户或者是去评定职称、办理退休的情况下都需要进行档案资料的核对,只有里面的文件才能够反映你的真实入职情况和工作情况。
人事档案一般所在的地方:
1、被国家行政机关、国有企事业单位录用的,人事档案一般在工作单位。
2、被国有企事业单位聘用,或被私企、外企等非国有企业聘用,或没有就业的大中专院校毕业生,人事档案有可能在读书的学校,也可能已寄到生源地或工作地的人才交流中心,也可能寄到大学生就业服务中心。
毕业后档案的三种托管方式:
1、毕业后升学:这种情况的档案处理比较简单,如果你成功的考取了研究生,录入院校会给你提供一份调档函,毕业前将调档函交给你的辅导员即可,学校会根据地址进行邮寄。
2、已经签约单位:毕业前已经找到工作单位的同学要和用人单位进行沟通,询问单位是否可以接收档案,如果能够接收档案的话,同样会给你提供单位的转接地址。
如果单位不能接收档案,这部分学生申请回原籍即可,毕业后学校会会根据学生的生源地信息,将你的档案直接打回生源地所在的人力资源和社会保障部门。
3、尚未签约的情况:这种情况比较复杂,有些同学考研失利准备二战、有些同学准备出国或者考取公务员等等。
但是不论那种情况,主要两种档案托管方式选择,一种是和高校所在地人才交流中心签约进行档案托管,另一种选择就是申请回原籍,将档案放置在家庭所在地人力资源和社会保障局进行托管。
法律依据:
《中华人民共和国档案法》
第十二条 按照国家规定应当形成档案的机关、团体、企业事业单位和其他组织,应当建立档案工作责任制,依法健全档案管理制度。
第十三条 直接形成的对国家和社会具有保存价值的下列材料,应当纳入归档范围:
(一)反映机关、团体组织沿革和主要职能活动的;
(二)反映国有企业事业单位主要研发、建设、生产、经营和服务活动,以及维护国有企业事业单位权益和职工权益的;
(三)反映基层群众性自治组织城乡社区治理、服务活动的;
(四)反映历史上各时期国家治理活动、经济科技发展、社会历史面貌、文化习俗、生态环境的;
(五)法律、行政法规规定应当归档的。
非国有企业、社会服务机构等单位依照前款第二项所列范围保存本单位相关材料。
第十四条 应当归档的材料,按照国家有关规定定期向本单位档案机构或者档案工作人员移交,集中管理,任何个人不得拒绝归档或者据为己有。
国家规定不得归档的材料,禁止擅自归档。
第十五条 机关、团体、企业事业单位和其他组织应当按照国家有关规定,定期向档案馆移交档案,档案馆不得拒绝接收。
经档案馆同意,提前将档案交档案馆保管的,在国家规定的移交期限届满前,该档案所涉及政府信息公开事项仍由原制作或者保存政府信息的单位办理。移交期限届满的,涉及政府信息公开事项的档案按照档案利用规定办理。
第十九条 档案馆以及机关、团体、企业事业单位和其他组织的档案机构应当建立科学的管理制度,便于对档案的利用;
按照国家有关规定配置适宜档案保存的库房和必要的设施、设备,确保档案的安全;
采用先进技术,实现档案管理的现代化。
档案馆和机关、团体、企业事业单位以及其他组织应当建立健全档案安全工作机制,加强档案安全风险管理,提高档案安全应急处置能力。
第二十四条 档案馆和机关、团体、企业事业单位以及其他组织委托档案整理、寄存、开发利用和数字化等服务的,应当与符合条件的档案服务企业签订委托协议,约定服务的范围、质量和技术标准等内容,并对受托方进行监督。
受托方应当建立档案服务管理制度,遵守有关安全保密规定,确保档案的安全。
第二十六条 国家档案主管部门应当建立健全突发事件应对活动相关档案收集、整理、保护、利用工作机制。
档案馆应当加强对突发事件应对活动相关档案的研究整理和开发利用,为突发事件应对活动提供文献参考和决策支持。
C#中使用托管资源和非托管资源的区别,以
托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。
非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标等。这类资源,垃圾回收器在清理的时候会调用Object.Finalize()方法。默认情况下,方法是空的,对于非托管对象,需要在此方法中编写回收非托管资源的代码,以便垃圾回收器正确回收资源。
在.NET中,Object.Finalize()方法是无法重载的,编译器是根据类的析构函数来自动生成Object.Finalize()方法的,所以对于包含非托管资源的类,可以将释放非托管资源的代码放在析构函数。
注意,不能在析构函数中释放托管资源,因为析构函数是有垃圾回收器调用的,可能在析构函数调用之前,类包含的托管资源已经被回收了,从而导致无法预知的结果。
本来如果按照上面做法,非托管资源也能够由垃圾回收器进行回收,但是非托管资源一般是有限的,比较宝贵的,而垃圾回收器是由CRL自动调用的,这样就无法保证及时的释放掉非托管资源,因此定义了一个Dispose()方法,让使用者能够手动的释放非托管资源。Dispose()方法释放类的托管资源和非托管资源,使用者手动调用此方法后,垃圾回收器不会对此类实例再次进行回收。Dispose()方法是由使用者调用的,在调用时,类的托管资源和非托管资源肯定都未被回收,所以可以同时回收两种资源。
Microsoft为非托管资源的回收专门定义了一个接口:IDisposable,接口中只包含一个Dispose()方法。任何包含非托管资源的类,都应该继承此接口。
在一个包含非托管资源的类中,关于资源释放的标准做法是:
(1) 继承IDisposable接口;
(2) 实现Dispose()方法,在其中释放托管资源和非托管资源,并将对象本身从垃圾回收器中移除(垃圾回收器不在回收此资源);
(3) 实现类析构函数,在其中释放非托管资源。
在使用时,显示调用Dispose()方法,可以及时的释放资源,同时通过移除Finalize()方法的执行,提高了性能;如果没有显示调用Dispose()方法,垃圾回收器也可以通过析构函数来释放非托管资源,垃圾回收器本身就具有回收托管资源的功能,从而保证资源的正常释放,只不过由垃圾回收器回收会导致非托管资源的未及时释放的浪费。
在.NET中应该尽可能的少用析构函数释放资源。在没有析构函数的对象在垃圾处理器一次处理中从内存删除,但有析构函数的对象,需要两次,第一次调用析构函数,第二次删除对象。而且在析构函数中包含大量的释放资源代码,会降低垃圾回收器的工作效率,影响性能。所以对于包含非托管资源的对象,最好及时的调用Dispose()方法来回收资源,而不是依赖垃圾回收器。
上面就是.NET中对包含非托管资源的类的资源释放机制,只要按照上面要求的步骤编写代码,类就属于资源安全的类。
下面用一个例子来总结一下.NET非托管资源回收机制:
Public class BaseResource:IDisposable
{
PRivate IntPtr handle; // 句柄,属于非托管资源
Private Componet comp; // 组件,托管资源
Private bool isDisposed = false; // 是否已释放资源的标志
PublicBaseResource
{
}
//实现接口方法
//由类的使用者,在外部显示调用,释放类资源
Publicvoid Dispose()
{
Dispose(true);// 释放托管和非托管资源
//将对象从垃圾回收器链表中移除,
// 从而在垃圾回收器工作时,只释放托管资源,而不执行此对象的析构函数
GC.SuppressFinalize(this);
}
//由垃圾回收器调用,释放非托管资源
~BaseResource()
{
Dispose(false);// 释放非托管资源
}
//参数为true表示释放所有资源,只能由使用者调用
//参数为false表示释放非托管资源,只能由垃圾回收器自动调用
//如果子类有自己的非托管资源,可以重载这个函数,添加自己的非托管资源的释放
//但是要记住,重载此函数必须保证调用基类的版本,以保证基类的资源正常释放
Protectedvirtual void Dispose(bool disposing)
{
If(!this.disposed)// 如果资源未释放 这个判断主要用了防止对象被多次释放
{
If(disposing)
{
Comp.Dispose();// 释放托管资源
}
closeHandle(handle);// 释放非托管资源
handle= IntPtr.Zero;
}
this.disposed= true; // 标识此对象已释放
}
}析构函数只能由垃圾回收器调用。
Despose()方法只能由类的使用者调用。
在C#中,凡是继承了IDisposable接口的类,都可以使用using语句,从而在超出作用域后,让系统自动调用Dispose()方法。一个资源安全的类,都实现了IDisposable接口和析构函数。
提供手动释放资源和系统自动释放资源的双保险。
请详细介绍一下在C#语言中什么是“非托管资源”,什么是“托管资源”
所谓非托管资源是你通过P/Invoke之类方法得到的os资源,CLR没有办法帮你释放这些资源。如果你对这些资源提供了包装WrapSource。那么这个WrapSource是托管资源了.他可能管理了非托管资源。但他自己是托管的。

更多文章:
server2008官网下载(sql server 2008 r2 express 官方)
2026年9月7日 13:00
域名邮箱域名续费(企业邮箱提示域名已过期,域名不在我这,怎么续费)
2026年9月7日 11:00
菜鸡免费版安卓破解下载(菜鸡云游戏最新版破解版永久免费无限时间下载地址)
2026年9月7日 02:10







