电脑软硬件应用网
当前位置: 电脑软硬件应用网 > 设计学院 > 网络编程 > C语言 > 正文
C语言基础C#中的Boxing/Unboxing
C语言基础C#中的Boxing/Unboxing
2010-3-19 9:16:24  文/佚名   出处:CND8学院   

  相比较C++,C#中的值类型和引用类型很简单:所有的基本类型、结构(struct)和String属于值类型,其它类型(其实也只剩下class了)都属于引用类型。那么值类型和引用类型有什么区别呢?

  值类型在赋值操作(“=”操作,函数参数,函数返回等)的时候,会把所有成员变量拷贝一遍给目标实例。

  引用类型在赋值操作的时候,只是把实例的内存中的地址赋值给目标实例。

  那么这两者有什么区别呢?

  那就是效率了:

  引用类型的赋值只要传递一个内存地址,传递的数据量就是一个32(64位操作系统是64)位整数。

  值类型需要传递该类型所包含的所有数据。

  比如:
  struct Point
  {
  public int x;
  public int y;
  }

  那Point类型的实例在赋值的时候,要传递的数据量是两个整数。

  如果数据量更大的结构,每次赋值的时候都要传递一遍所有的成员,那么总的程序运行期内,传递的数据量就非常可观了。

  怎么解决这种效率问题呢?

  考试大提示有两种方法:

  1 使用ref关键字。

  2 就是用所谓的Boxing/Unboxing了。

  首先,Boxing/Unboxing是针对值类型数据而言的。对引用类型来说,它本身就是引用类型,所以不存在Boxing/Unboxing的概念。

  其次,Boxing的操作就是把值类型的数据赋值到一个object的引用类型实例中,这个过程是值赋值的过程(就是所以数据都copy一遍)。

  如:
  Point p = new Point{x=10, y=11};
  Object o = p;

  这个变量o就是Boxing之后的引用类型了。记住一点,boxing之后,变量o就跟p无关了,它们是两个不同类型的变量,指向不同的内存地址。

  最后,Unboxing的操作是把这个object的引用类型实例,以值传递的方式赋值给目标对象。

  如:

  Point p2 = (Point)o;
  unboxing之后,p2跟o就无关了,它们是两个不同类型的变量,指向不同的内存地址。

  也就是说,Boxing/Unboxing的最大用途就是用于数据传递。

  理解Boxing/Unboxing还要与class的类型向父类/子类转换的操作区别开来(面向对象语言的继承机制)。

  将一个class的实例转换成它的父类或子类类型,这是类的继承机制。这种转换其实只是把实例的类型信息变了下,实例对应的数据,内存地址都没变动。转换前后的实例都是指向同一块内存。

  但我们可以把Boxing/Unboxing和class继承机制统一起来,用一句话来概括就是:引用进,引用出;值进,值出。

  • 上一篇文章:

  • 下一篇文章:
  • 最新热点 最新推荐 相关文章
    用C语言实现的闹钟程序
    C#实现Windows关机的代码
    用动态规划法求组和数的算法
    循环结构程序具有哪3个组成部分?
    const成员函数有什么特点?
    c语言求平均分程序
    一道关于指针的C语言题
    C语言求3个整数的最大公约数
    BM模式匹配算法C语言实现
    从键盘输入任意5个4位整数存入数组a…
    关于45IT | About 45IT | 联系方式 | 版权声明 | 网站导航 |

    Copyright © 2003-2011 45IT. All Rights Reserved 浙ICP备09049068号