.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 接口的。