Когда требуется закрепление, чтобы сборщик мусора в C # не двигал объект? - PullRequest
2 голосов
/ 15 февраля 2012

Когда требуется закрепление с помощью оператора fixed ()? Я вижу много примеров, в том числе от Microsoft :

public class Win32API {
[DllImport("User32.Dll")]
public static extern void GetWindowText(int h, StringBuilder s, 
int nMaxCount);
}
public class Window {
   internal int h;        // Internal handle to Window.
   public String GetText() {
      StringBuilder sb = new StringBuilder(256);
      Win32API.GetWindowText(h, sb, sb.Capacity + 1);
   return sb.ToString();
   }
}

Что мешает сборщику мусора перемещать объект StringBuilder во время вызова GetWindowText (), и почему они не закрепляют sb с помощью оператора fixed ()?

1 Ответ

7 голосов
/ 15 февраля 2012

Система сортировки при использовании Platform Invocation будет препятствовать перемещению объекта, но только в течение продолжительности вызова метода.

Закрепление требуется, если нативная сторона собирается сохранить ссылку на объект и попытаться сделать с ней «что-то» позже. Это не требуется для одиночного вызова в нативный метод, использующий P / Invoke.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...