簡體   English   中英

非非托管類型和托管類型之間有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM