array <t>和array <t ^>之间的区别,其中T是ValueType

时间:2016-09-02 14:20:59

标签: c# arrays c++-cli

我正在为我的C#项目在本机lib上编写C ++ / CLI包装器。我试图转换std :: vector&lt; unsigned char&gt;在C#中的本地c ++到System.Byte []。 在C ++ / CLI中,两种变体都是有效的

auto arr = gcnew array<System::Byte>(10);
auto arr = gcnew array<System::Byte^>(10);

但在C#代码的第一种情况下,我们得到了System :: Byte []类型,而在第二种情况下,我们得到了System :: ValueType []。

所以我的问题是为什么我们会有这种奇怪的行为?

1 个答案:

答案 0 :(得分:3)

^帽子只应用于参考类型。字节是一种值类型,因此array<System::Byte>是正确的声明。

不幸的是,C ++ / CLI 允许数组Byte^,将值转换为对象是.NET代码中支持的方案。该数组现在包含对象的引用,该对象是该字节的盒装值。 Boxing转换实现了一种着名的错觉,即值类型继承自System :: ValueType,它派生自System :: Object。您现在需要4个字节用于对象引用,而12个字节用于32个模式中的盒装字节对象,而不是1个字节的存储空间。

好吧,不要这样做。我从来没有遇到过必要或有用的场景。有一些场景需要装箱,例如反射,但是直接转向对象^更有意义,因为这就是记录这些方法的方式。