C#中的固定语句

时间:2020-03-06 14:55:34  来源:igfitidea点击:

在我们的一个项目中,我们具有与以下代码类似的代码。谁能用简单的英文解释为什么在这里需要固定的陈述?

class TestClass
{
    int iMyVariable;
    static void Main()
    {
        TestClass oTestClass = new TestClass();
        unsafe
        {
            fixed (int* p = &oTestClasst.iMyVariable)
            {
                *p = 9;
            }
        }
    }
}

解决方案

在执行指针算术的任何地方都需要它,以防止垃圾收集器在我们周围四处移动。

固定语句将"固定"内存中的变量,以使垃圾收集器在收集时不会将其移动。如果确实移动了变量,则指针将变得无用,并且当我们使用它时,我们将尝试访问或者修改我们不希望的内容。

因为我们在不安全模式(指针)下运行,所以固定指令为该变量分配了特定的内存空间。如果没有放置固定指令,则垃圾收集器可以在需要时将变量移到内存中的任何位置。

希望对我们有所帮助。

它将指针固定在内存中。垃圾收集语言可以自由地在内存中移动对象以提高效率。这对程序员是透明的,因为他们并没有真正在"普通" CLR代码中使用指针。但是,当确实需要指针时,如果要使用它们,则需要在内存中对其进行修复。

MSDN有一个非常相似的示例。固定语句基本上阻止垃圾收集。在.Net中,如果使用指向内存位置的指针,则运行时可以随时将对象重新分配到"更好"的位置。因此,如果我们想直接访问内存,则需要对其进行修复。