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



片段:

dynamic* pointerToDynamic = &fields;

虽然显然不允许使用该代码(您不能使用托管类型的地址),但它向我提出了一个问题:非托管类型是什么,它与托管类型有什么不同?还是只是Visual Studio试图变得有趣?

最佳答案

非托管和非托管指针之间有区别。

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

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

有关此here的更多信息。

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

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

希望现在有意义。

10-08 08:35
查看更多