装箱 (C++/CX)
装箱就是当一个值类型变量(如 Windows::Foundation::DateTime)或基础标量类型(如 int
)传递给以 Platform::Object^ 作为其输入类型的方法时,将该变量或类型包装在一个 ref 类中的过程。
将值类型传递给 Object^ 参数
虽然无需显式装箱变量以将该其传递给类型 Platform::Object^的方法参数,但当你检索之前已装箱的值时,必须显式转换回原始类型。
Object^ obj = 5; //scalar value is implicitly boxed
int i = safe_cast<int>(obj); //unboxed with explicit cast.
使用 Platform::IBox<T> 以支持可以为 null 的值类型
C# 和 Visual Basic 支持可以为 null 的值类型的概念。 在 C++/CX 中,可以使用 Platform::IBox<T>
类型以公开支持可以为 null 的值类型参数的公共方法。 下面的示例演示一个 C++/CX 公共方法,该方法在 C# 调用方为某个自变量传递 null 时返回 null。
// A WinRT Component DLL
namespace BoxingDemo
{
public ref class Class1 sealed
{
public:
Class1(){}
Platform::IBox<int>^ Multiply(Platform::IBox<int>^ a, Platform::IBox<int>^ b)
{
if(a == nullptr || b == nullptr)
return nullptr;
else
return ref new Platform::Box<int>(a->Value * b->Value);
}
};
在 C# XAML 客户端中,可按以下方式使用它:
// C# client code
BoxingDemo.Class1 obj = new BoxingDemo.Class1();
int? a = null;
int? b = 5;
var result = obj.Multiply(a, b); //result = null