我刚开始从文档中学习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
。为什么呢?
答案 0 :(得分:9)
所以在函数调用之后," t"应该收集为垃圾,所以" b"什么都不应该参考。
没有。垃圾收集器知道有多少变量仍在引用该实例,因此根本不会收集垃圾。当没有变量引用该实例时,垃圾收集器将启动。
答案 1 :(得分:1)
不完全是。
执行GetObj()
时,销毁的是指针t
,而不是Test
类型的实际对象。
当你向上移动堆栈时,b
现在指向该对象,因此没有收集该对象,因为它有对它的引用。
当Main()
执行完毕后,指针b
将超出范围,并且没有任何东西会再指向该对象,因此垃圾收集器将能够拾取它(在这种情况下,程序执行结束)。