为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我们需要在C#中装箱和拆箱?

/ 猿问

为什么我们需要在C#中装箱和拆箱?

HUWWW 2019-07-31 14:24:24

为什么我们需要在C#中装箱和拆箱?

为什么我们需要在C#中装箱和拆箱?


我知道拳击和拆箱是什么,但我无法理解它的实际用途。我应该在哪里以及在哪里使用它?


short s = 25;


object objshort = s;  //Boxing


short anothershort = (short)objshort;  //Unboxing


查看完整描述

4 回答

?
qq_慕容8568841

首先我想说,你那个“拳击”翻译得也太形象了点吧(用拳头把值类型锤进箱子里面去,哈哈哈哈……),正统的翻译叫“装箱”。然后说一下装箱和拆箱的用途,有时候你使用别人写的接口,用的是封装好的引用类型,而你定义的变量是值类型,这个时候就涉及到装箱。相反的,将别人的接口返回值(引用类型)转换成值类型,就涉及到拆箱。

例如:int    a=5;

          Func(object o);    //别人写的接口

          Func(a);    //你调用别人的接口

最后,说一下在泛型和object类都能解决问题的情况下,应该尽可能使用泛型,泛型是在编译期检查类型;而使用object会造成频繁的装箱和拆箱,有损性能,隐式转换也会带来编译错误。

        

查看完整回答
反对 回复 2019-09-09
?
蝴蝶刀刀

在.NET框架中,有两种类型 - 值类型和引用类型。这在OO语言中相对常见。

面向对象语言的一个重要特性是能够以类型无关的方式处理实例。这被称为多态性。既然我们想利用多态,但我们有两种不同的类型,必须有一些方法将它们组合在一起,这样我们才能以相同的方式处理其中一种。

现在,回到过去的日子(Microsoft.NET的1.0),没有这个新奇的泛型hullabaloo。您无法编写具有可以为值类型和引用类型提供服务的单个参数的方法。这是对多态性的违反。因此采用拳击作为将值类型强制转换为对象的手段。

如果这是不可能的,那么框架将充满方法和类,其唯一目的是接受其他类型的类型。不仅如此,但由于值类型并不真正共享一个共同类型的祖先,因此每个值类型(bit,byte,int16,int32等等)都必须有不同的方法重载。

拳击阻止了这种情况发生。 这就是英国庆祝节礼日的原因。


查看完整回答
反对 回复 2019-07-31

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信