当前位置: 首页 > 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://www.xdnf.cn/news/1484803.html

相关文章:

  • Docker启动失败 Failed to start Docker Application Container Engine.
  • ZYNQ SDK软件在线调试
  • Flutter SDK 安装与国内镜像配置全流程(Windows / macOS / Linux)
  • HTML 中的 CSS 使用说明
  • 华为HCIP-Datacom-Core Technology H12-831 书籍目录
  • 一款没有任何限制的免费远程手机控制手机的软件简介
  • linux Kbuild详解关于fixdep、Q、quiet、escsq
  • k8s核心技术-Helm
  • 去中心化投票系统开发教程 第五章:测试与部署
  • AI工具全解析:智能编码、数据标注与模型训练平台
  • 文件上传之读取文件内容保存到ES
  • 【iOS】block复习
  • 【Python脚本系列】PyCryptodome库解决网盘内.m3u8视频文件无法播放的问题(三)
  • macOS中设置环境变量的各文件及作用域
  • web后端知识(php和python)——第一阶段
  • java面试中经常会问到的mysql问题有哪些(基础版)
  • Android studio的adb和终端的adb互相抢占端口
  • SpringCloud Alibaba微服务--Gateway使用
  • 【音视频】WebRTC P2P、SFU 和 MCU 架构
  • Hadoop(九)
  • TypeORM、Sequelize、Hibernate 的优缺点对比:新手常见 SQL 与 ORM 踩坑总结
  • 【秋招笔试】2025.09.03华为研发岗
  • 基于Django的“社区爱心养老管理系统”设计与开发(源码+数据库+文档+PPT)
  • [C++刷怪笼]:set/map--优质且易操作的容器
  • 【C++】C++入门—(下)
  • pycharm如何设置对应的python解释器
  • PerfTest:轻量高性能压测工具,兼容 HTTP/1/2/3、WebSocket,并带实时监控
  • Conda 包管理器与环境管理使用指南
  • 【音频字幕】构建一个离线视频字幕生成系统:使用 WhisperX 和 Faster-Whisper 的 Python 实现
  • vue中axios与fetch比较