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

时间:2012-02-15 02:35:29

标签: c# garbage-collection interop

何时使用所需的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();
   }
}

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

1 个答案:

答案 0 :(得分:7)

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

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