C#中的固定语句

在我们的一个项目中,我们有类似的代码。 任何人都可以解释(简单英语)为什么需要修复语句?

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

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

fixed语句将“固定”内存中的变量,以便垃圾收集器在收集时不会移动它。 如果它确实移动了变量,指针将变得无用,当你使用它时,你将试图访问或修改你不想要的东西。

你需要在指针算术的任何地方使用它,以防止垃圾收集器在你身上移动它。

因为您在不安全模式(指针)中运行,所以固定指令会为该变量分配特定的内存空间。 如果你没有放入固定的指令,垃圾收集器可以随时随地在内存中移动变量。

希望这有帮助。

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