12

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

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

5 回答 5

17

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

于 2008-09-30T14:49:04.460 回答
9

固定语句会将变量“固定”在内存中,以便垃圾收集器在收集时不会移动它。如果它确实移动了变量,则指针将变得无用,并且当您使用它时,您将尝试访问或修改您不打算访问或修改的内容。

于 2008-09-30T14:48:25.520 回答
7

在进行指针运算的任何地方都需要它,以防止垃圾收集器在您身上移动它。

于 2008-09-30T14:47:17.740 回答
2

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

希望这有帮助。

于 2008-09-30T14:48:38.907 回答
2

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

于 2008-09-30T15:00:37.643 回答