装箱和拆箱:任何值类型、引用类型可以和object(对象)类型之间进行转换。
装箱转换是指将一个值类型隐式或显式地转换成一个System::Object类型,或者把这个值类型转换成一个被该值类型应用的接口类型(interface-type)。把一个值类型的值装箱,就是创建一个object实例并将这个值复制给这个object,装箱后的object对象中的数据位于堆中,栈中只存有数据的地址。被装箱的类型的值是作为一个拷贝赋给对象的。
要判断装箱后得到的System::Object原始类型,可以用System::Object类的GetType方法。
拆箱转换是指将一个对象类型显式地转换成一个值类型,或是将一个接口类型显式地转换成一个执行该接口地值类型。注意装箱操作可以隐式进行但拆箱操作必须是显式的。拆箱过程分成两步:首先,检查这个对象实例,看它是否为给定的值类型的装箱值。然后,把这个实例的值拷贝给值类型的变量。
在多线程扫描中遇到了一个问题:我想向扫描线程传递两个参数ip和port,但是ParameterizedThreadStart自能传递一个System::Object^类型的参数。我于是把ip和port放入IpPort类中, 然后将IpPort^隐式转换为System::Object^, 在进程中再将其显式的拆箱转换为IpPort^.
装箱:
IpPort^ i = gcnew IpPort("60.28.175.131", 80);
Thread^ t = gcnew Thread(gcnew ParameterizedThreadStart(this, &Form1::scan));
t->Start(i);
拆箱:
private: System::Void scan (System::Object^ i){
//MessageBox::Show("Type:" + i->GetType());
IpPort^ a = (IpPort^) i;
}