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