何时需要固定以避免C#垃圾收集器移动对象?

Mik*_*ike 2 c# interop garbage-collection

何时使用fixed()语句固定?我看到很多例子,包括微软的这个例子:

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();
   }
}
Run Code Online (Sandbox Code Playgroud)

什么阻止垃圾收集器在GetWindowText()调用期间移动StringBuilder对象,为什么不用固定()语句固定sb?

Ree*_*sey 7

使用平台调用时的编组系统将阻止对象移动,但仅限于方法调用的持续时间.

如果本机端要保存对象的引用,并且稍后尝试对其执行"某些操作",则需要固定.使用P/Invoke对本机方法进行单次调用不需要它.