何时需要钉扎以避免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?
当您使用平台调用时,编组系统将阻止对象被移动,但仅在方法调用的持续时间内。
如果本机端要保存对对象的引用,并在以后尝试对其执行"某些操作",则需要进行固定。使用P/Invoke对本机方法进行单个调用并不需要它。