首页 新闻 会员 周边 捐助

一个奇怪的值类型和引用类型问题,求解释。

0
悬赏园豆:50 [已解决问题] 解决于 2014-07-23 11:01

我觉得在TestHandler中,使用a.p1 = "ywb" 和使用a = new A() {P1 = "ywb"},

效果应该是一样的才对。

snryang的主页 snryang | 初学一级 | 园豆:24
提问于:2014-07-23 10:43
< >
分享
最佳答案
0

是不一样的,因为每次new的时候会重新分配地址,

在Main里面用var a = new A(),假设得到了a的地址0x1234,把这个地址传递给TestHandler之后,a.P1是基于这个地址的操作,所以修改完成之后,Main里面再访问0x1234得到的就是修改之后的。

但是在TestHandler里面再次a = new A()之后,a就不再是0x1234了,但是,传给TestHandler的数值(就是指这个地址)属于浅拷贝,函数内部对数值的修改不会影响Main里面表示的地址的值,所以Main里面a.P1还是基于0x1234去取值,得到的就还是new之前的值。

收获园豆:50
琴剑飘零 | 菜鸟二级 |园豆:419 | 2014-07-23 10:59
其他回答(2)
0

public static void TestHandler(ref A a);

Launcher | 园豆:45050 (高人七级) | 2014-07-23 10:52
0

ref关键字传递栈地址
引用类型传递的是堆地址
如果你把ref 使用到引用类型上那么就会把引用类型的地址传递过去
而不是把引用类型应用的堆地址传递过去
引用类型:他的引用是存储在栈地址 他的值存储在堆地址 引用里边的值就是他堆的地址
值类型:值存储在栈地址
如果你先把一个引用类型当作值类型看
那么他的值就是他所引用的地址

snryang | 园豆:24 (初学一级) | 2014-07-23 10:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册