C# 面试题 目录

C# 中 fixed 语句的作用

推荐答案

在 C# 中,fixed 语句用于在代码块中固定一个托管对象的内存地址,防止垃圾回收器(GC)在内存整理过程中移动该对象。通常用于与非托管代码交互时,确保指针指向的内存地址不会发生变化。

-- -------------------- ---- -------
------ ---- ---------
-
    ----- ----- - --- --------
    ----- ----- --- - ------
    -
        -- ------------ --------
        ---- - ---
    -
-

本题详细解读

fixed 语句的作用

在 C# 中,托管对象(如数组、字符串等)的内存地址是由垃圾回收器(GC)管理的。GC 会在内存整理过程中移动对象以优化内存使用。然而,在某些情况下(特别是与非托管代码交互时),我们需要确保对象的内存地址在特定代码块中保持不变。fixed 语句就是用来实现这一目的的。

使用场景

  1. 与非托管代码交互:当与非托管代码(如 C/C++ 库)交互时,可能需要将托管对象的指针传递给非托管代码。此时,使用 fixed 语句可以确保托管对象的内存地址在传递过程中不会被 GC 移动。

  2. 性能优化:在某些高性能场景中,直接操作固定内存地址可以避免不必要的内存复制和 GC 开销。

语法

  • type*:指向托管对象的指针类型。
  • ptr:指针变量名。
  • expression:需要固定内存地址的托管对象(通常是数组或字符串)。

注意事项

  1. unsafe 上下文fixed 语句必须在 unsafe 上下文中使用,因此需要在方法或代码块前加上 unsafe 关键字。

  2. 作用范围fixed 语句的作用范围仅限于其代码块内。一旦离开该代码块,对象的内存地址将不再固定。

  3. 性能影响:虽然 fixed 语句可以防止 GC 移动对象,但过度使用可能会导致内存碎片化,影响性能。

示例代码

-- -------------------- ---- -------
------ ---- -------------
-
    ----- ------- - --- ---------
    ----- ----- - - --------
    -
        --- ---- - - -- - - ---- ----
        -
            --- - -- - --
        -
    -
-

在这个示例中,numbers 数组的内存地址在 fixed 代码块中被固定,允许我们通过指针 p 直接修改数组内容。

纠错
反馈