c# – GCHandleType.Pinned类似于使用“fixed”关键字吗?

我正在尝试使用“安全”代码中的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
}

最佳答案 是的,结果是一样的.不同之处在于用法:假设一个异步填充缓冲区的外部方法,并在完成后调用回调.您无法传递使用fixed关键字固定的缓冲区指针,因为一旦您的变量超出范围,它将在外部方法仍尝试使用它时取消固定.

点赞