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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 陈君 于 2014-5-17 15:10 编辑

  附件是我调试的一个程序,我用它来验证值类型和引用类型的区别。用class和int来比较的时候可以发现:
值类型在赋值的时候会直接存储它的数据,就像a=b;a的内存里实际存储的是b的值。

而引用类型则不同。我们看Animal animal = dog。
animal的内存里实际存储的是dog这个对象的引用(地址)。所以当我们队animal.age赋值为20的时候,它实际就是通过其中保存着的地址找到那个存放age的内存单元然后改里面的值。由于animal.age和dog.age都是指向同一个内存,所以一旦那个内存里保存的值变了那么dog.age的值也会变化。就好像 是两个人共用一个装满金子的宝箱,如果一个人把里面的金子换成了石头,那么另一个人打开这个箱子的时候也只能看到石头,而不是原来的金子。

具体过程大家可以看下我的博客http://blog.sina.com.cn/s/blog_db23a6350101mj3h.html

但是在我使用String来调试的时候发现它和class不一样。它更像是一个值类型,

String s1 = "122222";
            String s2 = s1;
            String s3 = s1;
            s2 = "21111111";

这里如果是引用类型的话在s3改变了之后应该s1和s2也会跟着改变才是啊。这到底是为什么啊?或者说我博文里的分析是有问题的?

类型分析2.png (92.26 KB, 下载次数: 15)

类型分析2.png

类型分析3.png (99.98 KB, 下载次数: 16)

类型分析3.png

1.png (93 KB, 下载次数: 19)

1.png

1 个回复

倒序浏览
OBJECT是引用类型,但如果是int之类则这个应用可能是值,因为int也是继承自object

string在内存的表示上是引用(如果有C基础就能很好明白),但在实际使用中,.NET把string弄成了值类型。所以不要把string当引用类型看。

.NET中把引用的字符串值类型化的方案是每次对字符串变量赋值,包括字符串相加都是完全开辟新的存储空间给字符串变量使用。所以在使用string类型进行运算时比较消耗资源,此时可以使用stringbuilder类型替代。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马