亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Unsafe.AsPointer<T>(ref T value) 如何工作?

Unsafe.AsPointer<T>(ref T value) 如何工作?

C#
收到一只叮咚 2021-11-07 18:43:42
在 C# 中,您不能創建指向托管類型的指針,但使用此 API,您可以使用Unsafe.AsPointer<T>.https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/我看到使用 ILSpy 的源代碼,我看到了這個:[MethodImpl(MethodImplOptions.AggressiveInlining)][System.Runtime.Versioning.NonVersionable]public unsafe static void* AsPointer<T>(ref T value){    return &value;}同樣在其他類似的 API 中://Unity.Collections.LowLevel.Unsafe.UnsafeUtilitypublic unsafe static T ReadArrayElement<T>(void* source, int index){    return *(T*)((byte*)source + index * sizeof(T));}這是如何工作的以及如何復制這種行為?
查看完整描述

1 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

有問題的代碼不是有效的 C# 代碼,而且最初可能不是用 C# 編寫的。您看到的是 ILSpy 的底層代碼的 C# 表示 - C# 語法能夠表示這一點,因為它只是一個編譯器規則,表明您無法獲得指向托管類型的指針。


我的猜測(我不知道這個事實)有問題的代碼首先是用 IL 編寫的——如果你將它反編譯為 IL,你可以看到它是微不足道的:


.method public hidebysig static 

    void* AsPointer<T> (

        !!T& 'value'

    ) cil managed flag(0100) 

{

    .custom instance void 

        System.Runtime.Versioning.NonVersionableAttribute::.ctor() = (

        01 00 00 00

    )

    // Method begins at RVA 0x2190

    // Code size 3 (0x3)

    .maxstack 1


    IL_0000: ldarg.0

    IL_0001: conv.u

    IL_0002: ret

} // end of method Unsafe::AsPointer

(這是來自 System.Runtime.CompilerServices.Unsafe.dll。)


托管實例被加載到堆棧上,然后它只是作為無符號指針值返回。


如果您想重新創建此行為,您可以 - 只需在 IL 中編寫您的 DLL 并編譯它,然后從支持指針的任何其他 .NET 語言中引用它。


查看完整回答
反對 回復 2021-11-07
  • 1 回答
  • 0 關注
  • 429 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號