整数何时不应该减少?

时间:2019-07-01 18:37:26

标签: c# .net

所以我只是在用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的值。

1 个答案:

答案 0 :(得分:3)

尝试在GC之前添加睡眠以解决您的直接问题...而且您可能还会两次进行GC。 GC是不可预测的,可以随时以新的不可预测的行为进行更新。

尽管如此,总的来说,不要依赖特定垃圾收集器的行为来管理自己的实例计数。例如,不说Apollo = null,而是调用Apollo.selfDestruct()并具有减少实例计数的功能。

如果没有其他类碰巧有您的飞船实例并且您不知道,这样做的好处是不中断(在这种情况下将该实例设置为null永远不会破坏它)