array<T> 和 array<T^> 之间的区别,其中 T 是 ValueType
Difference between array<T> and array<T^> where T is ValueType
我正在为我的 C# 项目在本机库上编写 C++/CLI 包装器。我正在尝试将本机 C++ 中的 std::vector 转换为 C# 中的 System.Byte[]。
在 C++/CLI 中,两种变体均有效
auto arr = gcnew array<System::Byte>(10);
auto arr = gcnew array<System::Byte^>(10);
但在第一种情况下,在 C# 代码中我们得到了 System::Byte[] 类型,而在第二种情况下我们得到了 System::ValueType[].
所以我的问题是为什么我们会出现这种奇怪的行为?
^
帽子只能用于引用类型。字节是值类型,因此 array<System::Byte>
是正确的声明。
不幸的是,C++/CLI 也 允许 Byte^
的数组,将值转换为对象是 .NET 代码中受支持的方案。该数组现在包含对对象的引用,该对象是字节的 boxed 值。装箱转换实现了著名的错觉,即值类型继承自 System::ValueType,而 System::ValueType 派生自 System::Object。在 32 模式下,您现在需要 4 个字节用于对象引用和 12 个字节用于装箱字节对象,而不是一个元素的 1 个字节存储空间。
好吧,别那样做。我从来没有遇到过这是必要的或有用的场景。有一些场景需要装箱,例如反射,但直接转到 Object^ 更有意义,因为这是记录此类方法的方式。
我正在为我的 C# 项目在本机库上编写 C++/CLI 包装器。我正在尝试将本机 C++ 中的 std::vector
auto arr = gcnew array<System::Byte>(10);
auto arr = gcnew array<System::Byte^>(10);
但在第一种情况下,在 C# 代码中我们得到了 System::Byte[] 类型,而在第二种情况下我们得到了 System::ValueType[].
所以我的问题是为什么我们会出现这种奇怪的行为?
^
帽子只能用于引用类型。字节是值类型,因此 array<System::Byte>
是正确的声明。
不幸的是,C++/CLI 也 允许 Byte^
的数组,将值转换为对象是 .NET 代码中受支持的方案。该数组现在包含对对象的引用,该对象是字节的 boxed 值。装箱转换实现了著名的错觉,即值类型继承自 System::ValueType,而 System::ValueType 派生自 System::Object。在 32 模式下,您现在需要 4 个字节用于对象引用和 12 个字节用于装箱字节对象,而不是一个元素的 1 个字节存储空间。
好吧,别那样做。我从来没有遇到过这是必要的或有用的场景。有一些场景需要装箱,例如反射,但直接转到 Object^ 更有意义,因为这是记录此类方法的方式。