3

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

在某些时候,不再需要实例化类。我怎样才能冲洗它?

到目前为止,它还没有发生,即使这个类不再有任何事情可做(如果它是一个静态类,程序就会关闭),它仍然在我的列表中,它的公共变量仍然可用。 ..

4

5 回答 5

4

为什么要担心冲洗呢?为什么不让.Net 垃圾收集来做这件事呢?

或者你可以实现IDisposable并调用

MyClass.Dispose();

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

于 2010-06-20T02:05:53.483 回答
4

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

于 2010-06-20T02:07:43.183 回答
3

你可以让你的实例引发一个事件(比如 OnInactivate)。将项目添加到列表时,列表类应为此类事件添加处理程序(子类化或封装列表并覆盖 Add 方法)。当事件触发时,该对象将被列表从列表中移除。假设该对象没有在任何其他列表中引用(也可能正在侦听),那么垃圾收集器可以自由地处理该对象。

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

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

于 2010-06-20T02:18:26.903 回答
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);
    }
}
于 2010-06-20T02:24:09.753 回答
0

在不阻止垃圾回收的情况下引用对象的更通用解决方案是使用Wea​​kReference

于 2010-06-20T17:33:07.600 回答