何时需要钉扎以避免C#垃圾收集器移动对象

本文关键字:收集器 移动 对象 何时需 | 更新日期: 2023-09-27 18:24:42

什么时候需要使用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();
   }
}

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

何时需要钉扎以避免C#垃圾收集器移动对象

当您使用平台调用时,编组系统将阻止对象被移动,但仅在方法调用的持续时间内。

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