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

在 C# 程序集中,元数据头和元数据表分别承担哪些职责?它们如何协同支撑程序集的元数据描述?

技术原理C#

考察说明

考查对 C# 程序集元数据内部结构的理解,以及元数据头与元数据表在运行时和编译层面的作用。

回答思路

  1. 【回答框架 1】元数据头是程序集元数据的起始部分,包含元数据版本、标志、流声明及流头偏移等关键信息,用于定位和解析后续的元数据流。它相当于元数据的目录索引。
  2. 【回答框架 2】元数据表则按类型分组存储具体的元数据记录,例如模块表、类型定义表、字段表、方法表等,每条记录描述程序集中的一个逻辑元素及其属性、引用关系。
  3. 【回答框架 3】元数据头通过流头将各种流(如字符串堆、Blob 堆、GUID 堆)与表关联起来,运行时的加载器依据表头和堆数据实现类型的加载、字段访问与方法调用。
  4. 【回答框架 4】这样既实现了自描述,又支持跨语言互操作和反射。编译时生成,运行时可被 CLR 校验和读取,保证程序集的类型安全与版本一致性。
  5. 【关键点 1】元数据头是元数据的入口,记录版本、标志、流声明和偏移。
  6. 【关键点 2】元数据表分门别类存储类型、方法、字段等元数据记录。
  7. 【关键点 3】二者配合使程序集自描述,支撑反射、跨语言互操作和 CLR 加载校验。
  8. 【易错点 1】不要把元数据头理解为独立的元数据信息,它只是索引和定位信息。
  9. 【易错点 2】避免混淆元数据表和元数据流,表是逻辑概念,流是存储形式。
  10. 【易错点 3】不要认为元数据头存储实际数据,实际数据在堆中,头只提供偏移。