[英]What's the difference between a non-unmanaged type and a managed type?
當我為實驗目的編寫以下代碼段時,它引發了懸停錯誤(請參見屏幕截圖):
無法聲明指向非非托管類型的'動態'
片段:
dynamic* pointerToDynamic = &fields;
雖然代碼顯然是不允許的(你不能使用托管類型的地址),但它提出了一個問題:什么是非非托管類型 ,它與托管類型有什么不同? 或者只是Visual Studio試圖搞笑?
非托管和非托管指針之間存在差異。
托管指針是托管堆上對象的句柄,AFAIK僅在托管C ++中可用。 它等同於對象的C# 引用 。 另一方面,非托管指針等同於傳統的C風格指針,即內存位置的地址; C#為此提供一元&
運算符, fixed
關鍵字和unsafe
上下文。
您正在嘗試獲取指向托管字段的指針( dynamic
實際上是System.Object
偽裝),而C#僅允許指向非托管對象的指針,因此措辭:您的類型是非非托管的。
在這里再說一點 。
更新:為了使其更清晰,托管C ++支持經典的C風格指針和引用 。 但是為了保持C ++術語的一致性,相應地將它們稱為非托管和托管 指針 。 C#還支持指針(顯式地在unsafe
上下文中)和引用(隱含地涉及引用類型的對象),但后者不稱為“托管指針”,它們只是引用。
總結一下:在C ++中,有非托管和托管指針,在C#中是非托管指針和引用。
希望現在有意義。
您無法創建指向托管類型的指針。 雖然管理int,double等,但它們具有非托管對應項。
那么非非托管類型真正意味着托管類型 。
這里的問題是托管類型因為坐在堆上,你無法獲得指針。 您可以使用固定關鍵字獲取指針,但主要用於數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.