C#中装箱和拆箱的作用 the effection of boxing and unboxing

来源:互联网 发布:反映数据稳定性的指标 编辑:程序博客网 时间:2024/05/01 12:06

值类型和引用类型放在不同的地方,在互相转换的时候需要把数据搬过来搬过去,这就是装箱和拆箱了.

 

在于类型的转换


例如一个函数要处理传入的参数,但是这个参数可能是A、C、E这三种类型的类,那么一般做法就是重载函数。如果要是使用box和unbox的话,就可以把形参设定为object类型的,然后再用gettype来确定到底是哪种类型的类被传来处理。明白不?写个例子吧:
private void DisposeFunc( object O )
{
     switch( o.getType().ToString() )
     {
           case "A": //处理A;
           case "C": //处理C;
           。。。。。。。。。。。。。。
      }
}

 

有时封箱和拆箱操作会影响应用程序效率,可以看看.net 框架设计这本书.

 

关于装箱和拆箱,往往是在对值类型进行的操作,目的是将值类型数据从在栈上的存储转移到堆上,这样就和普通Object具有了同样的存储解构:栈上存储地址,堆上存储数据.这样就可以达到统一处理的效果.

 

装箱和拆箱的意义可以理解为值类型和引用类型的转换...要理解转换的意义,你就必须要先了解值类型和引用类型的区别和特点...

当你把一个值类型赋予给另外一个值类型,则会在堆栈中复制一个副本.修改值类型的数据,则不会影响到另一个数据值..而引用类型的赋值.把一个引用变量赋予另一个引用变量,则复制的是引用,而非内存值,所以,修改一个变量会影响到另外一个引用.

如果再深入了解的话,你会发现类型转换之间的关系对于性能的影响和操作的结果是很大的..看下面的这个例子:
string s = 10.ToString();
上面的代码的用拆箱的形式实现,代码表现为:
int i = 10;                           //在栈上分配一个int类型
object o = i;                         //把栈上的数据移到堆中,进行拆箱操作
string s = o.ToString();              //转换数据

 


装箱和拆箱 就是把值类型转为引用形或把引用形转为值,就是为了通用,但是会影响效率。虽然书上说尽量减少使用,其实大部分情况下不计较这个。因为如把一个方法的参数设置为object实在太方便。

 

装箱的目的,是为了解决未知参数类型传入的问题,装箱操作的产生有它的历史性.但是目前,已经重载和泛型,所以装箱已经没有使用的太大意义了.因为装箱的过程会产生额外的系统消耗,影响效率.

原创粉丝点击