class Person
{
private string name;
public string Name
{
get { return name;}
set { name = value;}
}
}
class App
{
static Main(string[] arr)
{
Person p1 = new Person();
p1.Name = "A";
Console.Writeline("p1.Name:"+p1.Name);
Person p2 = p1;
Console.Writeline("p1Name:"+p1.Name);
Console.Writeline("p1Name:"+p2.Name);
p2=null;
Console.Writeline("p1Name:"+p1.Name);
}
}
运行结果,p1.Name都为A.
我原先以为最后一句输出会因为null报错,结果没有.后来了解了一下CLR的机制,总结了一下以下结论.
1、引用类型变量,等号右号,CLR会在托管椎(Heap)上分配了一块内存,并且信息存储这里。
2、等号左右,其实在Stack中分配了一块内存,并且保存着等号右边的内存地址。
3、设置null,其实就是消毁等号左边存储在Stack中的信息,但并没有清空在Heap上的信息。因此,不会影响其它引用Heap上的信息。
综上所述,就是为什么将p2设置为null,p1仍然可以使用存储在Heap上内容的根本之所在。
BTW:当等号右边的信息没有任何地址引用的时候,会由GC自动管理并回收。