2010-06-20 106 views
3

所以,我有这个项目创建一个类的多个实例,并列出它们。如何删除一个类的实例?

在某些时候,实例类不再需要了。我怎么冲洗它?

到目前为止,即使类再也没有任何东西了(如果它是单个静态类,程序会关闭),它仍然不在我的列表中,它的公共变量仍然可用...

+0

什么?当它超出范围时它将变得“不可用”。它的范围是什么?静态的?然后它不会超出范围... – 2010-06-20 02:06:40

+1

假设你没有分配任何非托管资源,垃圾收集器应该及时处理它(只要它想要,但它会回收该内存 - 不需要强制收集)。 – Pwninstein 2010-06-20 02:08:32

+2

这听起来像你根本不明白垃圾收集。在你开始做.NET为你做的事情之前,你应该直截了当。 – 2010-06-20 03:14:56

回答

3

你可以让你的实例引发一个事件(OnInactivated,比如说)。当项目添加到列表(子类或封装列表并重写Add方法)时,列表类应为这些事件添加处理程序。事件触发时,该对象将通过列表从列表中删除。假设该对象没有在任何其他列表中被引用(这可能也在监听),那么垃圾收集器可以自由处理该对象。

这样,对象不需要跟踪所有对自身的引用,并知道如何通知引用持有者释放引用。

这里有一个可运行的例子:http://www.coderun.com/ide/?w=Hw83i0wAQkugUif5Oj2lmw

+0

+1我在@ Brian的回答中发布了类似于此的消息。 – slugster 2010-06-20 02:38:32

+0

谢谢,这是有道理的,我会尽力实现。 – Ben 2010-06-20 03:44:04

+1

@Ben - 我已经添加了一个可运行示例的链接。 – 2010-06-20 17:22:33

4

为什么要关注它呢?为什么不让.Net Garbage Collection做到这一点?

Altenatively你可以实现IDisposable和呼叫

MyClass.Dispose(); 

UPDATE:听起来你想自定义集合,而不是一个列表,将只返回活动类。创建一个名为MyClassCollection的新类,实现ICollection并确保它只返回活动类

+0

我需要该列表是最新的只有活动类,并忽略不活动的类。 – Ben 2010-06-20 02:08:05

+0

@你是什么意思的“积极班”? – Pwninstein 2010-06-20 02:11:01

4

您的问题意味着您将这些实例列入某种列表中。从列表中删除不再需要的实例,确保您没有任何其他引用。在某个时候,垃圾收集器将回收它们。

+0

因此,变为非活动状态的类需要以某种方式通知拥有该列表的类以将其从中移除...所以垃圾回收器可以处理它...错误...对吗? :) – Ben 2010-06-20 02:10:29

+0

如果这就是你的应用程序的组织方式,是的。 – 2010-06-20 02:13:58

+1

@本,也许你没有给我们所有的信息?我们如何知道这些课程何时变得不活跃?如果对象要举办一个活动说*“嗨,我没有更多的工作要做,我不再活跃”*? – slugster 2010-06-20 02:37:45

2

实例来讲解希望应该发生什么:

public class MyClass { 
    public string MyString { get; private set; } 
    public int MyInt { get; private set; } 
    public double MyDouble { get; private set; } 

    public MyClass(string myString, int myInt, double myDouble){ 
     MyString = myString; 
     MyInt = myInt; 
     MyDouble = myDouble; 
    } 
} 

public class SomeOtherClass{ 
    public List<MyClass> m_Instances = new List<MyClass>(); 

    public void FillList(){ 
     //Instantiate 3 items, and add to the list 
     m_Instances.Add(new MyClass("1", 2, 3d)); 
     m_Instances.Add(new MyClass("4", 5, 6d)); 
     m_Instances.Add(new MyClass("7", 8, 9d)); 
    } 

    public void RemoveFirst(){ 
     //Remove the first one. As long as the removed item has no 
     //other instances, the Garbage Collector will (in its own time) 
     //destroy that unused object, and reclaim the memory. 
     m_Instances.RemoveAt(0); 
    } 
} 
0

一个更通用的解决方案参考对象,而不会阻止其垃圾回收是使用WeakReference