• 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 方法不执行任何操作。如果您要让垃圾回收器在回收对象的内存之前对对象执行清理操作,您

    必须在类中重写 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方法)的不可以访问的内存。它改为将这些对象的项从终止队列中移除并将他们放置在标记

    为“准备终止”的对象列表中,该列表中的项指向托管堆中准备被调用其终止代码的对象,下次垃圾回收

    器进行回收时,就回收并释放了这些内存。

  • 相关阅读:
    PipeCAD轴网建模
    湖泊流域相关数据
    使用Kettle实现不同数据之间同步
    Azure DevOps Server 2020 补丁
    从SVN迁移代码到Azure DevOps Server
    SpringCloud中集成Sleuth实现链路追踪
    SpringCloudConfig集成Bus消息总线实现动态刷新配置(全局广播和定点通知)
    SpringCloudAlibaba中使用Nacos实现服务注册与发现(从实例入手)
    SpringCloudAlibaba中使用Sentinel实现流量控制以及流控规则详解
    Geoserver中点击TileLayers报错问题的一种解决办法
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/1353646.html
Copyright © 2020-2023  润新知