我正在尝试使用“安全”代码中的IntPtr,将其与“不安全”模式下的操作进行比较。
GCHandleType.Pinned类似于在不安全模式下使用“fixed”吗?
GCHandle pinnedArray = GCHandle.Alloc(byteArray, GCHandleType.Pinned);
IntPtr pointer = pinnedArray.AddrOfPinnedObject();
//do your stuff
pinnedArray.Free();
VS
byte[] buffer = new byte[255];
fixed (byte* p = buffer)
{
IntPtr ptr = (IntPtr)p;
// do you stuff here
}
答案 0 :(得分:2)
是的,结果是一样的。不同之处在于用法:假设一个异步填充缓冲区的外部方法,并在完成后调用回调。您无法传递使用fixed关键字固定的缓冲区指针,因为一旦您的变量超出范围,它将在外部方法仍尝试使用它时取消固定。