.NET 托管与非托管

一、托管(Managed)

  .NET 提供了一个称为公共语言运行时的运行时环境(CLR)。应用程序在创建第一个引用类型时,CLR就会为该引用类型分配内存。当对象失去引用时,就会触发GC过程自动回收。

  比如,

User user = new User()
{
  UserName = "admin",
  Password = "123qwe"
};

  此对象由CLR托管,我们只管创建对象,不管销毁对象。

二、非托管资源(Unmanaged Resource)

  非托管资源指的就是不由CLR管理回收销毁的资源,必须显式释放这些资源。最常用的非托管资源类型是包装操作系统资源的对象,如文件、窗口、网络连接或数据库连接。在代码中,当不再需要此对象(或其使用的资源)时,需要显示地调用Dispose()方法来销毁。

  比如,

public static void FileWrite()
{
  // 指定文件目录
  FileInfo fi = new FileInfo("D:/Resource/FileTemp");
  fi.Directory.Create();

  // 1 打开文件流
  FileStream stream = fi.OpenWrite();

  // 2 写入数据
  byte[] data = { 1, 2, 3, 4, 0xA0, 0xB1, 0xC2, 0xC3 };
  stream.Write(data, 0, 8);

  // 3 关闭文件流
  stream.Dispose();
}

  在最后必须调用stream.Dispose()方法来销毁对象。但是在我们日常的代码编写中需要确保非托管资源被销毁,因此我们添加异常捕获最终确保销毁。

  1.使用 try...catch...finally

public static void FileWrite()
{
  // 指定文件目录
  FileInfo fi = new FileInfo("D:/Resource/FileTemp");
  fi.Directory.Create();

  // 1 打开文件流
  FileStream stream = fi.OpenWrite();
  try
  {
    // 2 写入数据
    byte[] data = { 1, 2, 3, 4, 0xA0, 0xB1, 0xc2, 0xc3 };
    stream.Write(data, 0, 8);
  }
  catch (Exception ex)
  {

  }
  finally
  {
    // 3 关闭文件流
    stream.Dispose();
  }
}

  2.使用using(...){...}

public static void FileWrite()
{
    // 指定文件目录
    FileInfo fi = new FileInfo("D:/Resource/FileTemp");
    fi.Directory.Create();

    // 1 打开文件流
    using (FileStream stream = fi.OpenWrite())
    {
        // 2 写入数据
        byte[] data = { 1, 2, 3, 4, 0xA0, 0xB1, 0xc2, 0xc3 };
        stream.Write(data, 0, 8);
    }
}

三、识别托管与非托管

  CLR垃圾回收器回收托管对象使用的内存,而使用非托管资源的类型则实现 IDisposable 接口。

  比如,

  

   查阅官方文档可知,stream类是实现 IDisposable 接口的。

posted @ 2022-01-03 19:57  Zeng。  阅读(512)  评论(0编辑  收藏  举报