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

请描述 C# 中类型加载器的工作机制,它如何解析并加载类型?

技术原理C#

考察说明

考察对 C# 类型加载机制的理解,包括程序集、元数据和运行时行为的认识。

回答思路

  1. 【回答框架 1】类型加载器(如 .NET 运行时的加载器)负责在程序集元数据中找到类型定义,并解析其基类型、接口、方法等。它从程序集清单和类型定义元数据中提取信息,构建运行时类型对象(MethodTable),并初始化静态存储和方法的 JIT 编译入口。
  2. 【回答框架 2】加载过程通常发生在 JIT 编译时或显式调用 Type.GetType 时。加载器会先检查类型是否已加载,若未加载则从全局程序集缓存、应用程序目录或探测路径中定位程序集,然后读取元数据创建类型对象。
  3. 【回答框架 3】对于泛型类型,加载器会维护泛型定义和构造类型。每次用具体类型参数实例化时,会生成新的构造类型,但共享代码可用于引用类型参数,值类型参数则各自生成。
  4. 【回答框架 4】类型加载失败时,CLR 抛出 TypeLoadException,例如找不到程序集或基类型不匹配。加载后的类型对象会被缓存,后续使用直接复用。
  5. 【关键点 1】类型加载器从程序集元数据构建运行时类型对象,并缓存已加载类型。
  6. 【关键点 2】加载可能由 JIT 引发,或通过反射显式触发。
  7. 【关键点 3】泛型类型有共享代码机制,特定情况会生成专用代码。
  8. 【关键点 4】只要存在失败可能性,加载器就会抛出 TypeLoadException,且可能级联异常。
  9. 【易错点 1】不要混淆类型加载与程序集加载:程序集可能已加载,但类型未加载。
  10. 【易错点 2】泛型实例化可能不共享代码,尤其是值类型参数时,性能表现不同。
  11. 【易错点 3】类型加载失败不一定立刻抛出,可能延迟到首次使用时。