非非托管类型和托管类型之间有什么区别?
当我为实验目的编写以下代码段时,它引发了hover错误(参见屏幕截图):
无法声明指向非非托管类型的’动态’
片段:
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等,但它们具有非托管对应物。
那么非非托管类型真正意味着托管类型 。
这里的问题是托管类型因为坐在堆上,你无法获得指针。 您可以使用固定关键字获取指针,但主要用于数组。