我正在为我的C#项目在本机lib上编写C ++ / CLI包装器。我试图转换std :: vector< unsigned char>在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 []。
所以我的问题是为什么我们会有这种奇怪的行为?
答案 0 :(得分:3)
^
帽子只应用于参考类型。字节是一种值类型,因此array<System::Byte>
是正确的声明。
不幸的是,C ++ / CLI 还允许数组Byte^
,将值转换为对象是.NET代码中支持的方案。该数组现在包含对象的引用,该对象是该字节的盒装值。 Boxing转换实现了一种着名的错觉,即值类型继承自System :: ValueType,它派生自System :: Object。您现在需要4个字节用于对象引用,而12个字节用于32个模式中的盒装字节对象,而不是1个字节的存储空间。
好吧,不要这样做。我从来没有遇到过必要或有用的场景。有一些场景需要装箱,例如反射,但是直接转向对象^更有意义,因为这就是记录这些方法的方式。