int a = 3; object c = a;//装箱int b = (int)c;//拆箱代码形式上就是这样的。 从原理上来说,是值类型和引用类型的内存分配不一样。 int 这样的值类型可以说是没有指针的,就是在栈上开辟一段空间,把值放进去。 object 这样的引用类型,是在栈上分配指针,指向堆中的一段内存,这段内存才是真正的数据。 比如一个int变成 object 的话,就需要在在堆上创建一段内存空间,把int值存入,然后在栈上存入这个堆的地址 一个object变为int,反过来,需要先从堆中读取数据,然后在栈上存入这个数值。所以装箱和拆箱操作过于频繁,会导致频繁的在堆栈上的操作,浪费CPU,浪费内存。泛型的集合类出现,基本解决了这样的问题,基本不需要类型转化,对应的,装箱和拆箱也大规模的减少。
用.net框架程序集设置书里的一个例子来说说 ArrayList.Add(object obj); 接受一个object类型的参数 现在你传一个int类型的参数比如是 i 进去 可是这个方法接受的是一个引用类型的object你传进去的是一个值类型的 i 为了达到类型匹配,.net就通过一种叫做装箱的机制来处理这样的问题 就是说你必须把 i 这个参数给我包装一下不然我不认,怎么包装就是装箱了 不是太形象 o(∩_∩)o...哈哈
值类型转换类类型->装箱 object obj = (object)其他任何值类型 拆箱是把类类型即引用类型,转换为值类型,但引用类型转换值类型的格式要正确.如:int i = (int)引用类型
object c = a;//装箱int b = (int)c;//拆箱代码形式上就是这样的。
从原理上来说,是值类型和引用类型的内存分配不一样。
int 这样的值类型可以说是没有指针的,就是在栈上开辟一段空间,把值放进去。
object 这样的引用类型,是在栈上分配指针,指向堆中的一段内存,这段内存才是真正的数据。
比如一个int变成 object 的话,就需要在在堆上创建一段内存空间,把int值存入,然后在栈上存入这个堆的地址
一个object变为int,反过来,需要先从堆中读取数据,然后在栈上存入这个数值。所以装箱和拆箱操作过于频繁,会导致频繁的在堆栈上的操作,浪费CPU,浪费内存。泛型的集合类出现,基本解决了这样的问题,基本不需要类型转化,对应的,装箱和拆箱也大规模的减少。
ArrayList.Add(object obj);
接受一个object类型的参数 现在你传一个int类型的参数比如是 i 进去
可是这个方法接受的是一个引用类型的object你传进去的是一个值类型的 i
为了达到类型匹配,.net就通过一种叫做装箱的机制来处理这样的问题
就是说你必须把 i 这个参数给我包装一下不然我不认,怎么包装就是装箱了
不是太形象 o(∩_∩)o...哈哈
拆箱是把类类型即引用类型,转换为值类型,但引用类型转换值类型的格式要正确.如:int i = (int)引用类型