所以我只是在用C#练习编码,我试图弄清楚为什么当我将一个对象设置为null并继续收集垃圾时,我的逻辑为什么没有给我减少静态整数的结果
我还没有真正尝试过什么,这是一个问题,为什么会出现这种结果,我将对象指针设置为null后调用了WriteLine()以查看已经制作了多少艘太空飞船,并且即使垃圾收集后仍说1。 (我认为甚至没有必要这样做。)
using System;
using System.Collections.Generic;
namespace ConsoleApp1
{
static class Information
{
public static int Spaceships_Made = 0;
}
class Spaceship
{
public Spaceship()
{
Information.Spaceships_Made++;
Console.WriteLine("Spaceships : {0}", Information.Spaceships_Made);
}
~Spaceship()
{
Information.Spaceships_Made--;
Console.WriteLine("Spaceships : {0}", Information.Spaceships_Made);
}
}
class Program
{
static void Main(string[] args)
{
Spaceship Apollo = new Spaceship();
Apollo = null;
GC.Collect();
Console.WriteLine(Information.Spaceships_Made);
Console.ReadKey();
}
}
}
我希望调用WriteLine的结果为0,因为我试图完全擦除刚刚创建的Apollo指针,但是它看起来仍然是1的值。
答案 0 :(得分:3)
尝试在GC之前添加睡眠以解决您的直接问题...而且您可能还会两次进行GC。 GC是不可预测的,可以随时以新的不可预测的行为进行更新。
尽管如此,总的来说,不要依赖特定垃圾收集器的行为来管理自己的实例计数。例如,不说Apollo = null,而是调用Apollo.selfDestruct()并具有减少实例计数的功能。
如果没有其他类碰巧有您的飞船实例并且您不知道,这样做的好处是不中断(在这种情况下将该实例设置为null永远不会破坏它)