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

在编写 unsafe 代码时,C# 的 fixed 关键字主要解决了什么问题?它具体是如何操作的?

技术原理C#

考察说明

考察对 C# unsafe 代码中 fixed 关键字作用机制的理解。

回答思路

  1. 【回答框架 1】fixed 关键字用于在 unsafe 上下文中固定托管变量,防止垃圾回收器在移动对象时改变其地址,从而获得稳定的指针。
  2. 【回答框架 2】它通常用于获取数组、字符串等引用类型内部数据的指针,以便进行高效的内存操作,例如直接访问数组元素或字符串字符。
  3. 【回答框架 3】使用 fixed 时,变量会被固定在内存中,直到代码块结束,保证指针在此期间有效,避免了悬垂指针和访问无效内存的风险。
  4. 【回答框架 4】fixed 语句的常见形式包括 fixed (int* p = array) { ... } 以及 fixed (char* p = str) 等,也可在方法参数列表中使用 fixed 来声明指针参数。
  5. 【回答框架 5】此外,fixed 只能在 unsafe 上下文中使用,并且需要编译器选项允许不安全代码。
  6. 【关键点 1】fixed 固定托管变量地址,防止 GC 移动导致指针失效。
  7. 【关键点 2】用于获取数组、字符串等内部数据的指针进行直接操作。
  8. 【关键点 3】fixed 块结束后,变量自动解除固定,指针不再有效。
  9. 【关键点 4】必须在 unsafe 代码块中使用 fixed。
  10. 【易错点 1】错误地认为 fixed 可以固定任意对象,实际只适用于可转换为指针的托管类型。
  11. 【易错点 2】在 fixed 块外使用固定期间获得的指针,会造成悬垂访问。
  12. 【易错点 3】忽略 fixed 块作用域,导致不必要的长时间固定,影响 GC 效率。