2008-09-30 22 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中,如果使用指向內存位置的指針,運行時可以隨時將對象重新分配到「更好」的位置。所以如果你想直接訪問內存,你需要修復它。