我觉得在TestHandler中,使用a.p1 = "ywb" 和使用a = new A() {P1 = "ywb"},
效果应该是一样的才对。
是不一样的,因为每次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之前的值。
public static void TestHandler(ref A a);
ref关键字传递栈地址
引用类型传递的是堆地址
如果你把ref 使用到引用类型上那么就会把引用类型的地址传递过去
而不是把引用类型应用的堆地址传递过去
引用类型:他的引用是存储在栈地址 他的值存储在堆地址 引用里边的值就是他堆的地址
值类型:值存储在栈地址
如果你先把一个引用类型当作值类型看
那么他的值就是他所引用的地址