当前位置:编程学习 > C#/ASP.NET >>

为什么要进行装箱和拆箱行为

以前没有留意这种基础,只知道装箱是将值类型转换为引用类型。拆箱就是将引用类型转换为值类型。
那为什么要进行装箱和拆箱行为呢?
谢谢! --------------------编程问答-------------------- 似乎是吃饱了撑的,但是还是很有用,比如你寄快递也是一样封了寄到目的地别人还得拆真实麻烦,但是方便运输。
--------------------编程问答-------------------- 系统也是差不多如一个方法函数需要2个参数一个整型一个是字符串,这很好办,如果他需要10个参数每个参数都不一样那你就得定义10个参数?要是100个参数那你定义100个。。。
那现在你可以把100个参数封装成一个类,函数只要得到这个类在拆开就可以了。 --------------------编程问答-------------------- 这个问题在反射中用得非常典型,当别人给你调用一个服务时,让你获取一个对象,你也不知道这个是什么对象,这时候你就要用反射对对象拆箱,才知道它有什么属性方法.

反射概念:
公共语言运行库加载器管理应用程序域。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。
程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。

好好理解一下. --------------------编程问答-------------------- 道理很简单,按理说C#被设计成一种完全面向对象的语言。因此,包括数字、字符、日期、布尔值等等在内的一切,都是对象。似乎只需要一种方式来对待这些对象就可以了。

但是C#不是只停留在学院中和理想中,它必须为性能而妥协,我们知道,对于CPU来说,处理一个完整的对象,需要很多的指令,对于内存来说,又需要很多的内存。如果连整数都是对象,那么性能自然很低。C#于是使用了一种机制,使得这些基本类型在一般的编程中被当作非对象的简单类型处理,在另一些场合,又允许它们被视作是一个对象。这种机制就是装箱和拆箱。

装箱后的对象看上去和一个对象一样,拥有方法,可以当作object处理,拆箱后的变量,看上去又如同C语言中的那些变量、结构体一样,可以直接参与运算和处理。 --------------------编程问答-------------------- 1楼2楼3楼似乎都跑题了。 --------------------编程问答-------------------- 为了类型转换

就像他爷可以代替他说话,但他代替不了他爷说话。因为等级不一样 --------------------编程问答-------------------- 2楼就是在胡扯,希望大家过滤掉才好。 --------------------编程问答--------------------
引用 4 楼 caozhy 的回复:
道理很简单,按理说C#被设计成一种完全面向对象的语言。因此,包括数字、字符、日期、布尔值等等在内的一切,都是对象。似乎只需要一种方式来对待这些对象就可以了。

但是C#不是只停留在学院中和理想中,它必须为性能而妥协,我们知道,对于CPU来说,处理一个完整的对象,需要很多的指令,对于内存来说,又需要很多的内存。如果连整数都是对象,那么性能自然很低。C#于是使用了一种机制,使得这些基本类型在一般的编程中被当作非对象的简单类型处理,在另一些场合,又允许它们被视作是一个对象。这种机制就是装箱和拆箱。

装箱后的对象看上去和一个对象一样,拥有方法,可以当作object处理,拆箱后的变量,看上去又如同C语言中的那些变量、结构体一样,可以直接参与运算和处理。
解释不错 --------------------编程问答--------------------
引用 4 楼 caozhy 的回复:
道理很简单,按理说C#被设计成一种完全面向对象的语言。因此,包括数字、字符、日期、布尔值等等在内的一切,都是对象。似乎只需要一种方式来对待这些对象就可以了。

但是C#不是只停留在学院中和理想中,它必须为性能而妥协,我们知道,对于CPU来说,处理一个完整的对象,需要很多的指令,对于内存来说,又需要很多的内存。如果连整数都是对象,那么性能自然很低。C#于是使用了一种机制,使得这些基本类型在一般的编程中被当作非对象的简单类型处理,在另一些场合,又允许它们被视作是一个对象。这种机制就是装箱和拆箱。

装箱后的对象看上去和一个对象一样,拥有方法,可以当作object处理,拆箱后的变量,看上去又如同C语言中的那些变量、结构体一样,可以直接参与运算和处理。

说的不错。 --------------------编程问答-------------------- 没装箱拆箱 貌似做不出来现在的应用吧 --------------------编程问答-------------------- 你买了100斤大米为什么要用袋子装呢?为什么不一个个拿回去? --------------------编程问答-------------------- .net中有两种类型,值类型和引用类型。
有时候值类型需要在只接收引用类型的场合使用,这时候就得装箱。反之,则要拆箱。

那干脆一种类型统一不就行了。
如果都用引用类型,堆上的处理速度慢,性能不好。
如果都用值类型,甚好,但可怜的1M用户栈哪能容得下所有的数据。

于是,平衡处理,就出现了现在的这种局面。值类型与引用类型并存,常用且轻量级的数据结构作为值类型,其他作为引用类型。然后通过拆装箱的机制实现不同场合的通用。 --------------------编程问答-------------------- 装箱跟封装是一个意思么。。。 --------------------编程问答--------------------
引用 13 楼 linrachel 的回复:
装箱跟封装是一个意思么。。。

怎么楼上几位好像都是这么理解的,装箱就是把属性装到类里面。。。。

--------------------编程问答--------------------
引用 13 楼 linrachel 的回复:
装箱跟封装是一个意思么。。。

装箱怎么会是封装。。。 --------------------编程问答--------------------
引用 7 楼 wddw1986 的回复:
2楼就是在胡扯,希望大家过滤掉才好。


请楼主和大家注意此人,职业灌水的,技术水平极差,靠打嘴炮灌水混经验,打击职业灌水,从我们做起。顶 --------------------编程问答--------------------
引用 16 楼 abcmsnet 的回复:
Quote: 引用 7 楼 wddw1986 的回复:

2楼就是在胡扯,希望大家过滤掉才好。


请楼主和大家注意此人,职业灌水的,技术水平极差,靠打嘴炮灌水混经验,打击职业灌水,从我们做起。顶


说实话,你2L的回答真的不比胡扯好多少。想来你有自知之明,点到即可,没想到自己还跳出来。 --------------------编程问答-------------------- 如果你测试各种值类型的具体“外观”,你会发现.net保证了它们与其它类型具有相同的特性。因此我们才知道——原来所有类型都是object。

但是为了效率,实际上对于值类型,在.net底层并不是按照object对象来封装的,而是使用了传统的、最通用的计算机机制直接实现。

这告诉我们,不要简单地“自底向上”去拼凑知识。因为高层次的知识也是一种经验总结,不管在不同的底层如何实现,我们都应该去同时把握较高层的知识。有些人以为只要从底层的东西入手就能理解高层次的设计知识,这是不对的,这会成为缺少灵活性的书呆子。

装箱拆箱,是因为上述理由而客观存在的一种稍微麻烦的东西。我们因此就应该避免装箱。如果你理解为什么“值类型在一个非常标准的面向对象语言(OOPL)的外表之下其实并没有用统一的object来处理”,也就容易理解这个要求了! --------------------编程问答--------------------
引用 17 楼 caozhy 的回复:
Quote: 引用 16 楼 abcmsnet 的回复:

Quote: 引用 7 楼 wddw1986 的回复:

2楼就是在胡扯,希望大家过滤掉才好。


请楼主和大家注意此人,职业灌水的,技术水平极差,靠打嘴炮灌水混经验,打击职业灌水,从我们做起。顶


说实话,你2L的回答真的不比胡扯好多少。想来你有自知之明,点到即可,没想到自己还跳出来。


我无话可说了,这就是版主的德行,宁愿灌水也不让我们这些人说点真话。 --------------------编程问答--------------------
引用 19 楼 abcmsnet 的回复:
Quote: 引用 17 楼 caozhy 的回复:

Quote: 引用 16 楼 abcmsnet 的回复:

Quote: 引用 7 楼 wddw1986 的回复:

2楼就是在胡扯,希望大家过滤掉才好。


请楼主和大家注意此人,职业灌水的,技术水平极差,靠打嘴炮灌水混经验,打击职业灌水,从我们做起。顶


说实话,你2L的回答真的不比胡扯好多少。想来你有自知之明,点到即可,没想到自己还跳出来。


我无话可说了,这就是版主的德行,宁愿灌水也不让我们这些人说点真话。


要不让你说,早就删除了。你有站在你的立场说真话的权利,但是别人也有站在他的立场说真话的权利,包括指出你说的不对的权利。 --------------------编程问答-------------------- 我在做C/S程序的时候,我有一大堆各种类型的数据需要传输到另一方,于是我就把这些各种数据类型打包成类,然后类序列化发送到另一方,另一方接受到数据包再转换成类。这难道不可以解释为封包拆包的理论吗,为什么说是胡扯,真不明白、 --------------------编程问答--------------------
引用 21 楼 abcmsnet 的回复:
我在做C/S程序的时候,我有一大堆各种类型的数据需要传输到另一方,于是我就把这些各种数据类型打包成类,然后类序列化发送到另一方,另一方接受到数据包再转换成类。这难道不可以解释为封包拆包的理论吗,为什么说是胡扯,真不明白、


因为装箱拆箱是专有名词。你不能把放火烧车解释成火车,或者运轮胎的船叫做轮船。 --------------------编程问答-------------------- 只能说站在我的立场上我认为那个解释还是可以的,但是被人说是胡扯,我感觉很委屈,我认为我并没有故意乱说一通或者说些不粘编辑的话。我觉得你可以说你解释的不到位,直接说人胡扯,大部分都不会接受的,最多能说我的解释和举例比较勉强和错误,你说胡扯,明显有诋毁别人的意思。 --------------------编程问答--------------------
引用 23 楼 abcmsnet 的回复:
只能说站在我的立场上我认为那个解释还是可以的,但是被人说是胡扯,我感觉很委屈,我认为我并没有故意乱说一通或者说些不粘编辑的话。我觉得你可以说你解释的不到位,直接说人胡扯,大部分都不会接受的,最多能说我的解释和举例比较勉强和错误,你说胡扯,明显有诋毁别人的意思。

反正我说的是你跑题了,以及比胡扯好不了太多。 --------------------编程问答-------------------- 就好比我上学的时候有次英语考试选择题8题只对了2题,我朋友说,你还不如瞎蒙呢。我承认我付出了劳动和诚意,但是结果真的不比瞎蒙强。我不觉得受到了诋毁。 --------------------编程问答-------------------- 以后这类问题都这样解释:
装箱转换是指将一个值类型隐式地转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型,把一个值类型的值装箱,也就是创建一个object实例并将这个值复制给这个object.  
    C#装箱和拆箱正好相反,拆箱转换是指将一个对象类型显式转换成一个值类型,或是将一个接口类型显式转换成一个执行该接口的值类型.拆箱的过程分为两步,首先,检查这个对象实例,看它是否为给定的值类型的装箱值,然后,把这个实例的值拷贝给值类型的变量. --------------------编程问答-------------------- 楼主看到没,哥给你造势炒作你这个帖子红了,记得给哥点辛苦分哈。 --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,