GCHandleType.Pinned与使用“fixed”关键字类似吗?

时间:2014-01-11 18:51:07

标签: c# garbage-collection unsafe intptr

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

1 个答案:

答案 0 :(得分:2)

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