vc.net中的“装箱”(boxing)与“拆箱”(unboxing)

本文详细介绍了.NET中值类型与引用类型之间的装箱和拆箱转换过程。装箱是将值类型转换为object类型的过程,而拆箱则是相反的过程。文章通过一个具体的多线程扫描示例解释了如何实现这一转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装箱和拆箱:任何值类型、引用类型可以和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;
 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值