非非托管类型和托管类型之间有什么区别?

时间:2012-03-30 10:33:16

标签: c# .net types unmanaged managed

当我为实验目的编写以下代码段时,它引发了悬停错误(请参见屏幕截图):

  

无法声明指向非非托管类型'dynamic'的指针

摘录:

dynamic* pointerToDynamic = &fields;

虽然代码显然不被允许(您无法获取托管类型的地址),但它提出了一个问题:非非托管类型是什么?它与托管类型?或者只是Visual Studio试图变得有趣?

enter image description here

2 个答案:

答案 0 :(得分:7)

非托管和非托管指针之间存在差异。

托管指针是托管堆上对象的句柄,AFAIK仅在托管C ++中可用。它等同于对象的C#引用。另一方面,非托管指针等同于传统的C风格指针,即存储器位置的地址; C#为此提供了一元&运算符,fixed关键字和unsafe上下文。

您正在尝试获取指向托管字段的指针(dynamic实际上System.Object是伪装的),而C#只允许指向非托管对象的指针,因此措辞:您的类型是非托管的

关于here的更多内容。

更新:为了使其更加清晰,托管C ++支持经典的C风格的指针引用。但为了保持C ++术语的一致性,它们相应地称为非托管托管 指针。 C#还支持指针(显式位于unsafe上下文中)和引用(隐含地涉及引用类型的对象),但后者是称为“托管指针”,它们只是引用。

总结一下:在C ++中,有非托管和托管指针,在C#中是非托管指针和引用。

希望现在有意义。

答案 1 :(得分:2)

您无法创建指向托管类型的指针。虽然管理int,double等,但它们具有非托管对应物。

那么非非托管类型的真正含义是托管类型

这里的问题是托管类型因为坐在堆上,你无法获得指针。您可以使用 fixed 关键字获取指针,但主要用于数组。