.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 接口的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现