当前位置: 首页 > news >正文

C#中的托管资源与非托管资源介绍

C#中的托管资源与非托管资源介绍

  • 一、托管资源与非托管资源是什么
  • 二、两者特点与区别
  • 三、开发注意事项
  • 四、实战 Demo:托管资源和非托管资源的使用示例
    • 示例1:纯托管资源的使用
    • 示例2:非托管资源的using释放
    • 示例3:自定义非托管资源的IDisposable实现
  • 总结

C#中的托管资源与非托管资源介绍

在C#开发中,根据是否受.NET运行时(CLR)管理,资源分为托管资源和非托管资源。理解两者差异对防止内存泄漏、保障程序稳定性很有帮助

一、托管资源与非托管资源是什么

  • 托管资源:由CLR全程管理的对象(如string、List、自定义类实例等)。其生命周期(创建、内存分配、回收)完全由垃圾回收器(GC)负责,开发者不需要手动干预
  • 非托管资源:不受CLR管理的底层资源(如文件句柄、数据库连接、网络套接字、Windows API句柄等),由操作系统分配,GC无法识别和回收,必须手动释放,否则会导致内存泄漏

二、两者特点与区别

对比项 托管资源 非托管资源
管理主体 .NET CLR(垃圾回收器GC) 操作系统 + 开发者手动管理
内存处理 GC自动分配(new)、自动回收 操作系统分配,需手动释放
类型安全 受CLR检查(防类型错误、内存越界) 无类型安全检查(需开发者保证)
释放责任 GC自动处理(开发者无需干预) 开发者必须显式释放
泄漏风险 低(GC回收未引用对象) 高(忘记释放则长期占用资源)
典型示例 List、自定义类实例 文件流(FileStream)、数据库连接、IntPtr句柄

三、开发注意事项

  1. 非托管资源必须手动释放:GC仅回收托管资源,非托管资源(如文件流)需手动释放,不然系统资源迟早被耗光
  2. 优先使用using语句:对于实现IDisposable接口的非托管资源对象(如FileStream),用using包裹其代码块,代码块结束后会自动调用Dispose()释放资源,即使发生异常也能保证执行
  3. 自定义非托管资源需实现IDisposable:要是自己实现的类里包含非托管资源(如通过P/Invoke获取的句柄),必须实现IDisposable接口,这样才能保证资源正确释放,还能避免重复回收
  4. 纯托管资源无需手动释放:像List等纯托管资源,不要用using或Dispose(),交给 GC 就好了,多余的代码不仅影响可读性,还可能降低效率

四、实战 Demo:托管资源和非托管资源的使用示例

示例1:纯托管资源的使用

using System;
using System.Collections.Generic;class ManagedExample
{// 自定义托管类public class User { public string Name { get; set; } }static void Main(){// 创建托管资源(GC自动管理)List<string> list = new List<string> { "a", "b" };User user = new User { Name = "Test" };// 使用资源Console.WriteLine(string.Join(",", list));Console.WriteLine

文章转载自:

http://QAcmQZrH.mrpqg.cn
http://UHjPHmbA.mrpqg.cn
http://KjsGqGOF.mrpqg.cn
http://hGSm27no.mrpqg.cn
http://wloc8REO.mrpqg.cn
http://fdSIvJ1M.mrpqg.cn
http://BeDj2tpQ.mrpqg.cn
http://nSCxiuHm.mrpqg.cn
http://phLtjPgw.mrpqg.cn
http://omlHn9WR.mrpqg.cn
http://Pft7PqWX.mrpqg.cn
http://tAQGPrjp.mrpqg.cn
http://f6b5ttQ8.mrpqg.cn
http://PirMea5h.mrpqg.cn
http://r59p8Pi9.mrpqg.cn
http://OY31XWkF.mrpqg.cn
http://PqpF1989.mrpqg.cn
http://YeG5UGRV.mrpqg.cn
http://oxwphjaO.mrpqg.cn
http://sRRbytsI.mrpqg.cn
http://pmhxGgKy.mrpqg.cn
http://ZfV8llB5.mrpqg.cn
http://Ju9R0rBM.mrpqg.cn
http://3xh0jvfD.mrpqg.cn
http://8ARenIFs.mrpqg.cn
http://ueTC5C4Y.mrpqg.cn
http://dx7NAZIv.mrpqg.cn
http://57sun6o6.mrpqg.cn
http://LtpaHdvU.mrpqg.cn
http://FJTA0Mfh.mrpqg.cn
http://www.dtcms.com/a/371534.html

相关文章:

  • 初识Vue
  • JSP到Tomcat特详细教程
  • 滑动窗口与双指针(1)——定长
  • Lua > OpenResty Lua Module
  • [LeetCode 热题 100] 32. 最长有效括号
  • Python IO编程——文件读写
  • fps:游戏玩法
  • S 4.1深度学习--自然语言处理NLP--理论
  • [NCTF2019]Fake XML cookbook
  • ARM体系结构学习②
  • 多环境配置切换机制能否让开发与生产无缝衔接?
  • SC3336 rgb sensor linux
  • 人工智能学习:Transformer架构
  • Android --- AOSP源码导入Android Studio
  • 华为HCIP-Datacom-Core Technology H12-831 书籍目录
  • (RDFS)随机深度特征选择方法解释:简而言之,RDFS主要针对的是恶意的服务器,它建立在客户端是诚实的前提下。
  • 《从使用到源码:OkHttp3责任链模式剖析》
  • 华为IP(9)
  • 【秋招笔试】2025.09.03华为研发岗
  • 动态维护有效区间:单调栈
  • Ubuntu 22 安装 postgresql-17.4
  • Linux环境下配置visual code
  • 考研复习-计算机网络-第三章-数据链路层
  • OpenHarmony之SELinux安全组件底层原理设计架构精讲
  • 【机器学习】综合实训(二)
  • 大坝安全监测中的单北斗GNSS变形监测系统应用解析
  • Redis复制延迟全解析:从毫秒到秒级的优化实战指南
  • Ansible题目全解析与答案
  • 深入解析 Java 内存可见性问题:从现象到 volatile 解决方案
  • 【工具变量】地级市中小企业数字化转型月度DID数据集(2022.1-2025.7)