方法甚至在终止后返回类引用

时间:2017-03-27 13:43:56

标签: c# garbage-collection

我刚开始从文档中学习C#7.0。我了解到Class是一种引用类型。但是,方法如何返回对已经销毁的对象的引用。

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    public class Program
    {
        public static void Main()
        {
            Test b = GetObj();
            Console.WriteLine(b.val);
            Console.ReadLine();
        }
        public class Test
        {
            public int val;
        }
        public static Test GetObj()
        {
            Test t = new Test();
            t.val = 100;
            return t;
        }
    }

}

此处,方法GetObj创建一个Test对象,并返回它。根据文档,仅返回对它的引用。因此,在函数调用之后,t应该被收集为垃圾,因此b不应该引用任何内容。

但代码仍会打印100。为什么呢?

2 个答案:

答案 0 :(得分:9)

  

所以在函数调用之后," t"应该收集为垃圾,所以" b"什么都不应该参考。

没有。垃圾收集器知道有多少变量仍在引用该实例,因此根本不会收集垃圾。当没有变量引用该实例时,垃圾收集器将启动。

答案 1 :(得分:1)

不完全是。

执行GetObj()时,销毁的是指针t,而不是Test类型的实际对象。

当你向上移动堆栈时,b现在指向该对象,因此没有收集该对象,因为它有对它的引用。

Main()执行完毕后,指针b将超出范围,并且没有任何东西会再指向该对象,因此垃圾收集器将能够拾取它(在这种情况下,程序执行结束)。