2008-09-30 24 views
12

我们在其中一个项目中具有与以下类似的代码。任何人都可以用简单的英语解释为什么这里需要固定陈述吗?C#中的固定语句

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

回答

17

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

7

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

+0

我看不到任何指针算术在问题中完成。也许你可以澄清'算术'的含义。没有+ - *也没有/。 – 2015-12-18 20:53:46

9

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

2

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

希望得到这个帮助。

2

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