如何删除匿名对象,并检查他们是否在C#

问题描述:

说仍然存在我有一个for循环,创造像这样的匿名对象:一旦for循环运行如何删除匿名对象,并检查他们是否在C#

using System; 
using System.Threading; 

namespace gctest 
{ 
    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      Console.WriteLine ("Hello World!"); 
      for (int i = 0; i < 50; i++){ 
       myObject newobject = new myObject(i); 
      } 
     } 
    } 
    class myObject{ 
     int i; 
     public myObject(int i){ 
      this.i = i; 
      Announcer newannouncer = new Announcer (i); 
      Thread newthread = new Thread (newannouncer.Start); 
      newthread.Start(); 
     } 
     ~myObject() // destructor 
     { 
      Console.WriteLine ("=============================Object " + i + " HAS BEEN DESTROYED!========================="); 
     } 
    } 
    class Announcer{ 
     int i; 
     public Announcer(int i){ 
      this.i = i; 
     } 
     public void Start() 
     { 
      while (true) { 
       Console.WriteLine ("OBJECT" + i + " STILL EXISTS!"); 
       Thread.Sleep (500); 
      } 
     } 
    } 
} 

,没有任何名字,我可以用来引用myObject实例,这意味着它们没有被引用,因此应该被垃圾收集,对吗?但这不是什么情况。他们不断打印表示仍然存在的信息,但我无法访问或删除它们。我也看不到从析构函数方法打印的消息,这意味着他们没有被垃圾收集。

如何删除我创建的这些匿名对象并检查它们不存在?我不仅希望线程停止,因为我可以在重新启动线程的myObjects中添加另一个方法。我想要myObject实例被完全删除。

编辑:经过12分钟的运行对象终于被垃圾收集。迈克是对的。

您的匿名对象确实会收集垃圾。你无法知道他们不是垃圾收集;您看到的消息来自您开始的线程,而不是来自您的匿名对象。

如果你想看到的东西是否会被垃圾回收,你可以做两件事情之一:

  1. 容易的事做的就是添加一个析构函数(~myObject()),并打印“我是garbage-集!”从中。

  2. 做(这虽然是多了很多的工作)的最好的事情是保持WeakReferenceList一个s到你的对象,并定期浏览清单,看看是否有对象的引用都成了空。

+0

我向myObject添加了一个析构函数方法,并且析构函数中的消息从未打印(我运行该程序超过10分钟)。 – 2015-02-08 12:32:07

+0

12分钟后,他们已经收集垃圾了。 – 2015-02-08 12:34:30

+0

这很奇怪。他们应该几乎立即收集垃圾。我不知道为什么花了这么长时间。 – 2015-02-08 12:41:11

公共语言运行时间(CLR)跟踪线程并且垃圾收集器不会摆脱它们。您需要停止线程并取消对线程对象的任何引用,并等待垃圾收集器为您执行肮脏的工作。

+0

你说的绝对正确,但恐怕他的问题不完全是这样;我认为首要的问题是我在回答中描述的情况。 – 2015-02-08 12:26:23