2014-01-11 42 views
4

我正在用「安全」代碼對IntPtr進行試驗,並將其與「不安全」模式下的事情進行比較。GCHandleType.Pinned與使用「fixed」關鍵字類似嗎?

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 
} 

回答

2

是,結果是一樣的。不同之處在於它的用法:假設一個異步填充緩衝區的外部方法,並在完成後調用回調。您無法傳遞使用fixed關鍵字固定的緩衝區指針,因爲一旦變量超出範圍,它將被解除固定,而外部方法仍會嘗試使用它。