何时使用所需的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 ?
答案 0 :(得分:7)
使用平台调用时的编组系统将阻止对象移动,但仅限于方法调用的持续时间。
如果本机端要保存对象的引用,并且稍后尝试对其执行“某些操作”,则需要固定。使用P / Invoke对本机方法进行单次调用不需要它。