显示类中的实例数

时间:2017-06-14 17:22:55

标签: c# garbage-collection

删除构造函数后,如何打印实例数?由于我在GC之前和之后显示相同的数字。

 Console.WriteLine("Number of instances: {0}", Book.readNumber());
 b2 = null;
 GC.Collect();

 Console.WriteLine("Number of instances after GC: {0}", Book.readNumber());

我有4个实例通过readNumber进入,但它仍然输出4而不是3后GC的b2。

请求的Book类:

class Book
    {
        public String ISBN;
        public String Author;
        public double Price;
        private static int Quantity;
        public static int readNumber() { return Quantity; } 
        public Book ()
        {
            this.ISBN = "no ISBN"; this.Author = "no Author";  this.Price = 0.0;
            Quantity++;
        }
        ~Book() { Quantity--; }//first attempt to reduce the instance counter by 1
}

使用Quantity,我会计算类中的实例并将其保存在count中以便在main中使用。

2 个答案:

答案 0 :(得分:0)

class Book
{
    public String ISBN;
    public String Author;
    public double Price;
    private static int Quantity;
    public static int readNumber() { return Quantity; }
    public Book()
    {
        this.ISBN = "no ISBN"; this.Author = "no Author"; this.Price = 0.0;
        System.Threading.Interlocked.Increment(ref Quantity);
    }
    ~Book() { System.Threading.Interlocked.Decrement(ref Quantity); }
}

class Program
{
    static void Main()
    {
        Book one = new Book();
        Book two = new Book();
        Console.WriteLine(Book.readNumber());   // Outputs 2

        Console.ReadKey();
    }
}

您无法准确控制垃圾收集器何时运行。您可以通过运行GC.Collect()向垃圾收集器指示运行它是一个好时机(但是,我不会这样做)。如果您关注垃圾收集前后的内存,我相信这将涵盖您的情况。通过互锁,这也有助于保护您免受与对象并发的任何实例计数问题的影响。

我认为值得注意的是,记忆中的内容与被引用或使用的内容是两个不同的不同计数。如果不再使用引用,它并不意味着垃圾收集器会立即清理它,而是它会在垃圾收集器耗尽之前在内存中挂起一段时间。

答案 1 :(得分:-3)

不要使用静态字段,但如果你坚持:

class MyClass: IDisposable
    {
        public static int instanceCount;
        public MyClass()
        {
            instanceCount++;
        }

        public void Dispose()
        {
            instanceCount--;
        }
    }

和主要功能:

static void Main(string[] args)
        {
            MyClass a = new MyClass();
            MyClass b = new MyClass();
            Console.WriteLine(MyClass.instanceCount);
            b.Dispose();
            Console.WriteLine(MyClass.instanceCount);
            Console.ReadLine();
        }