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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mr_jack 中级黑马   /  2014-3-31 09:47  /  1393 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

值类型和引用类型的区别是什么,举个通俗易懂的例子呢.

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

3 个回复

正序浏览
每一个值类型都有一个独立的内存区域保存自己的值,调用它的时候调用的是他的值,而引用类型调用的是内存中的地址 比如a1=18,这时候在内存中保存的是18,当把a1付给a2的时候,他们两个应用的是同一个内存空间,a2的值会保存为a1的值,当把a2改为20是,应为a1和a2引用的是同一个所以a1也变成20了,这是引用类型,值类型是当把a1付给a2时会为a2在开一块新的空间保存a1的值。当把a2改成20时就会在a2的空间保存20,和a1就没关系了
回复 使用道具 举报
C#将类型分为两类,一类是值类型,另一类是引用类型。大部分固有的基本类型(如整型,浮点型)是值类型,结构类型也是值类型。引用类型包括类、接口、数组和字符串。基本的概念非常简单,那就是一个值类型的实例代表了实际的数据(存在栈中),而一个引用类型的实例代表指向数据的指针或者引用(存在堆中)。

在C#中是这样的:

int x1 = 3; // x1是堆栈上的值   
int x2 = new int();   
x2 = 3; // x2还是堆栈上的值!

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
本帖最后由 Darkhorse′Xa 于 2014-3-31 10:59 编辑

你可以这么想:
值类型他们的地址和所存储的值都是在内存的栈里头,首先在栈里开辟空间,值是存在在栈空间里.然后当我们进行赋值的时候是将A(比如)这个空间里头的值拷贝一份给B这个空间.所有你改变A变量的值,对B变量并没有影响.
引用类型比如声明一个string str=c#首先也会在栈里开辟空间,同时会在堆里也开辟一块合适大小的空间.而值是存放在堆里面的也就是说c#存放在堆里头,那堆是有地址的吧,所有栈里面存放的是什么呢?其实就是堆的内存地址.当我们进行赋值的时候同样是将栈里的地址拷贝一份给str2(比如)空间.而栈里存储的是这个堆的地址,那把地址拷贝一份给str2空间是不是也就是说他们指向的是同一个堆,当我们把str2的值改变了,那str的值是不是也会跟着改变呢?是吧.
希望对你有帮助

评分

参与人数 1技术分 +1 收起 理由
czwanglei + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马