A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王起 中级黑马   /  2013-3-16 21:13  /  1724 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

值类型和引用类型的最基本的区别
    C#将类型分为两类,一类是值类型,另一类是引用类型。大部分固有的基本类型(如int, char)是值类型,structs 也是值类型。引用类型包括类、接口、数组和字符串。基本的概念非常简单,那就是一个值类型的实例代表了实际的数据(存在栈中),而一个引用类型的实例代表指向数据的指针或者引用(存在堆中)。  C++开发者最容易混淆的地方是:C#已经自己预定义了一些类型作为值类型,一些作为引用类型,而一个C++的开发者希望能够自己控制。 例如,在C++中,我们可以这样做:  int x1 = 3; // x1 是堆栈上的值  int *x2 = new int(3) // x2 是堆的一个值的引用  但是在C#中没有这样的控制: int x1 = 3; // x1是堆栈上的值  int x2 = new int();  x2 = 3; // x2还是堆栈上的值!  既然 int是值类型,而 class是引用类型,那么int是怎样从Object派生的呢?     是这样的,当int用作int时候,这是一个值类型(在栈上),然而,当它用作是Object时,这是一个引用堆上的整数值的引用类型。换而言之,当你将int看作对象时,运行层将它自动转化为对象引用,这个转化过程称作装箱(boxing)。这个转换包括将栈里的值拷贝到了堆里,并且新建了一个对象的实例来引用该值。拆箱操作(unboxing)是个反过程——将对象转化为基于栈的值类型。  int x = 3; // 堆栈上新的int类型,值为3  object objx = x; // 堆上新的int, 设定值为3,x=3仍然在堆栈上  int y = (int)objx; //新的int类型的值3在堆栈上,x=3在堆栈上,objx=3在堆上

1 个回复

倒序浏览
{:soso_e179:}  顶一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马