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关键字固定的缓冲区指针,因为一旦您的变量超出范围,它将在外部方法仍尝试使用它时取消固定。