日期:2014-05-17  浏览次数:20794 次

帮忙解释一下为什么是这个输出结果?
namespace MyTest
{
class Person
{
public string name;

public void Fun()
{
Console.WriteLine("你好我是{0}",this.name);
}
}

class Program
{
static void Main(string[] args)
{
Person p1 = new Person();
p1.name = "张三";

Person p2 = p1;

p1.name = "李四";

p1.Fun();
p2.Fun();
Console.ReadKey();
}
}

}

------解决方案--------------------
Person p2 = p1;

你把 p1 赋给了 p2 ,他们的值当然一样的
------解决方案--------------------
class 是引用类型
------解决方案--------------------
C#中类是引用类型,Person p2 = p1;传递的是p1的引用,即内存中的地址。因此修改了p1的值p2也会改变。如果是值类型如int i= 0; int j = i;  i=1;在输出就不是一样的了
------解决方案--------------------
Person p1 = new Person();
p1.name = "张三";
p1.Fun();

Person p2 = p1;
p1.name = "李四";
p2.Fun();
------解决方案--------------------
class是引用类型
p1和p2引用了同一对象
------解决方案--------------------
肯定是一样的 p2和p1引用同一个对象,都获取name最新那个赋值。
------解决方案--------------------
当p1 = new  Person();person 在堆中创建一个person实例,通过映射关系,p1指向new person()的实际物理地址,把p1 赋值给p2 ,p2并没有在堆中分配实际的内存,只是在栈中分配了一个p2的内存空间,当p1的值改变时,实际是改变堆中的结果,所以p2的值也改变了
------解决方案--------------------
想让p2的值不发生变化,应该通过p2 = new person(); p2 = p1;
------解决方案--------------------
Person类是引用类型,
p2其实是指向p1的引用,及p2和p1指向为同一个对象。所以当p1.Name再赋值"李四"时,p2.Name也为"李四"
Person p1=new Person();
p1.Name="李四";
p1=null;
Person p2=p1;
p2.Name=?

这个时候对像p2也为Null,