C#面试题更新 2026-08-05

请解释 C# 中托管代码与非托管代码的定义,并说明这两类代码在执行过程中的主要不同之处。

技术原理C#.NET

考察说明

考察对 .NET 运行时管理和代码执行机制的基本理解

回答思路

  1. 【回答框架 1】托管代码是在公共语言运行时(CLR)管理下运行的代码,例如 C#、VB.NET 编译得到的 IL,由 CLR 提供垃圾回收、类型安全、异常处理等服务。非托管代码则直接编译为机器码,独立于 CLR 运行,例如 C++ 代码,需要自行管理内存。
  2. 【回答框架 2】运行时区别主要在资源管理:托管代码由 CLR 自动管理内存,通过垃圾回收回收不再使用的对象;非托管代码需手动分配和释放内存,如使用 malloc/free,容易产生内存泄漏或非法访问。
  3. 【回答框架 3】类型安全与异常处理也有差异:托管代码在 CLR 监督下保证类型安全,并提供跨语言异常处理;非托管代码缺乏这些机制,类型错误可能导致未定义行为,异常处理依赖具体语言和系统。
  4. 【回答框架 4】性能与互操作:托管代码经过 JIT 编译,启动可能稍慢,但现代 JIT 优化不错;非托管代码直接执行原生指令,性能开销较低。通过 P/Invoke 或 COM Interop 实现互操作,但调用边界有额外成本。
  5. 【关键点 1】托管代码在 CLR 下运行,具备垃圾回收、类型安全和异常处理;非托管代码直接运行于操作系统,需手动管理资源。
  6. 【关键点 2】内存管理是核心差异:托管代码自动回收,非托管代码需手动释放,容易出错。
  7. 【关键点 3】非托管代码性能通常更高,但安全性和健壮性较弱;互操作通过 P/Invoke 实现。
  8. 【易错点 1】不要把托管代码等同于 C# 或 .NET,其他语言也可编译为托管代码。
  9. 【易错点 2】垃圾回收并非实时,非托管代码可能因时机差异导致资源竞争。
  10. 【易错点 3】互操作调用不只是性能损失,还可能引入平台差异和数据封送问题。