c#非托管

转载 2007年09月24日 20:51:00
非托管
在.net 编程环境中,系统的资源分为托管资源和非托管资源。
对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作。也就是说对于您的应用程序创建的大多数对象,可以依靠 .NET Framework 的垃圾回收器隐式地执行所有必要的内存管理任务。

对于非托管资源,您在应用程序中使用完这些非托管资源之后,必须显示的释放他们,例如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 等等资源。可能在使用的时候很多都没有注意到!

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

非托管资源如何释放,.NET Framework 提供 Object.Finalize 方法,它允许对象在垃圾回收器回收该对象使用的内存时适当清理其非托管资源。默认情况下,Finalize 方法不执行任何操作。默认情况下,Finalize 方法不执行任何操作。如果您要让垃圾回收器在回收对象的内存之前对对象执行清理操作,您必须在类中重写 Finalize 方法。然而大家都可以发现在实际的编程中根本无法override方法Finalize(),在C#中,可以通过析构函数自动生成 Finalize 方法和对基类的 Finalize 方法的调用。

例如:

~MyClass()
{
// Perform some cleanup operations here.
}

该代码隐式翻译为下面的代码。

protected override void Finalize()

    try 
    { 
        // Perform some cleanup operations here. 
    } 
    finally 
    { 
        base.Finalize(); 
    }
}

但是,在编程中,并不建议进行override方法Finalize(),因为,实现 Finalize 方法或析构函数对性能可能会有负面影响。一个简单的理由如下:用 Finalize 方法回收对象使用的内存需要至少两次垃圾回收,当垃圾回收器回收时,它只回收没有终结器(Finalize方法)的不可访问的内存,这时他不能回收具有终结器(Finalize方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收器进行回收时,就回收并释放了这些内存
  

相关文章推荐

C#程序实现动态调用非托管的DLL文件

C#程序实现动态调用非托管的DLL文件 一.Dll文件   动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要...

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解)

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解) 原文链接: http://www.cnblogs.com/liping13599168/archive/2011/03/31/...

C#程序实现动态调用非托管的DLL文件

C#程序实现动态调用非托管的DLL文件 最近的一个项目需要用C#调用C++的Dll,由于C++的Dll是非托管的,所以调用时需要一些技巧。下面分享给新手。   一.Dll文件   动态链接...

使用了非托管的第三方库的c++动态库在c#中的调用

         在c#中使用c++动态库,一般情况下有两种有两种方法,第一种是使用c++\CLI,这种方法比较直观,但是需要花费时间学习c++\CLI,比较简单的方法是PInvoke,但是这种...

C++ 非托管COM在C#下调用的问题

最近打算使用新思的触摸板开发包实现一个手势软件 整个SDK主要由以下几部分组成: 说明文档 样例代码 .dll动态链接库文件 .lib库文件 .h头文件 新思的SDK是已...

C#中调用非托管的DLL及参数传递 (一)

微软的.NET框架的优点之一是它提供了独立于语言的开发平台。你可以在VB、C++、C#等语言中编写一些类,而在其它语言中使用(源于.NET中使用了CLS),你甚至可以从另一种语言编写的类中继承。但是你...

使用平台调用(PInvoke)实现C#调用非托管C++代码

1.问题描述众所周知,不同的语言有不同的优势,如何让不同的语言在一个程序中“各司其职”、“分工协作”一直是一个人们想要达到的目标。有许多时候,我们需要用C#语言调用C++语言写成的代码:一方面,C#在...

C#中调用非托管的DLL及参数传递

?????? 微软的.NET框架的优点之一是它提供了独立于语言的开发平台。你可以在VB、C++、C#等语言中编写一些类,而在其它语言中使用(源于.NET中使用了CLS),你甚至可以从另一种语言编写的类...

C#直接调用C++非托管结构体、类、成员函数、成员变量

[StructLayout(LayoutKind.Sequential)] public class MyOGRE { //该方式是直接调用C+...

C#调用非托管C++DLL的两种方法

C#编写的代码属于跨平台的托管代码,C++语言可以编写托管(managed)和非托管(native)代码。在C#与C++的混合编程中,经常会使用C#来调用native C++的DLL,下面有两种常用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)