现在的位置: 首页 > 综合 > 正文

null在CLR中的作用

2012年12月28日 ⁄ 综合 ⁄ 共 786字 ⁄ 字号 评论关闭

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自动管理并回收。

抱歉!评论已关闭.