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