删除构造函数后,如何打印实例数?由于我在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中使用。
答案 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();
}