所以,我有这个项目,它创建一个类的多个实例,并列出它们。
在某些时候,不再需要实例化类。我怎样才能冲洗它?
到目前为止,它还没有发生,即使这个类不再有任何事情可做(如果它是一个静态类,程序就会关闭),它仍然在我的列表中,它的公共变量仍然可用。 ..
为什么要担心冲洗呢?为什么不让.Net 垃圾收集来做这件事呢?
或者你可以实现IDisposable并调用
MyClass.Dispose();
更新:听起来你想要一个自定义集合,而不是一个列表,它只会返回活动类。创建一个名为 MyClassCollection 的新类,该类实现ICollection并确保它只返回活动类
您的问题意味着您在某种列表中有这些实例。从列表中删除您不再需要的实例,确保您没有对它们的任何其他引用。在某个时候,垃圾收集器会回收它们。
你可以让你的实例引发一个事件(比如 OnInactivate)。将项目添加到列表时,列表类应为此类事件添加处理程序(子类化或封装列表并覆盖 Add 方法)。当事件触发时,该对象将被列表从列表中移除。假设该对象没有在任何其他列表中引用(也可能正在侦听),那么垃圾收集器可以自由地处理该对象。
这样,对象就不需要跟踪所有对自身的引用,并且知道如何通知引用持有者释放引用。
这是一个可运行的示例:http ://www.coderun.com/ide/?w=Hw83i0wAQkugUif5Oj2lmw
希望解释应该发生什么的示例:
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);
}
}
在不阻止垃圾回收的情况下引用对象的更通用解决方案是使用WeakReference。