所以,我有这个项目创建一个类的多个实例,并列出它们。如何删除一个类的实例?
在某些时候,实例类不再需要了。我怎么冲洗它?
到目前为止,即使类再也没有任何东西了(如果它是单个静态类,程序会关闭),它仍然不在我的列表中,它的公共变量仍然可用...
所以,我有这个项目创建一个类的多个实例,并列出它们。如何删除一个类的实例?
在某些时候,实例类不再需要了。我怎么冲洗它?
到目前为止,即使类再也没有任何东西了(如果它是单个静态类,程序会关闭),它仍然不在我的列表中,它的公共变量仍然可用...
你可以让你的实例引发一个事件(OnInactivated,比如说)。当项目添加到列表(子类或封装列表并重写Add方法)时,列表类应为这些事件添加处理程序。事件触发时,该对象将通过列表从列表中删除。假设该对象没有在任何其他列表中被引用(这可能也在监听),那么垃圾收集器可以自由处理该对象。
这样,对象不需要跟踪所有对自身的引用,并知道如何通知引用持有者释放引用。
这里有一个可运行的例子:http://www.coderun.com/ide/?w=Hw83i0wAQkugUif5Oj2lmw
为什么要关注它呢?为什么不让.Net Garbage Collection做到这一点?
Altenatively你可以实现IDisposable和呼叫
MyClass.Dispose();
UPDATE:听起来你想自定义集合,而不是一个列表,将只返回活动类。创建一个名为MyClassCollection的新类,实现ICollection并确保它只返回活动类
我需要该列表是最新的只有活动类,并忽略不活动的类。 – Ben 2010-06-20 02:08:05
@你是什么意思的“积极班”? – Pwninstein 2010-06-20 02:11:01
您的问题意味着您将这些实例列入某种列表中。从列表中删除不再需要的实例,确保您没有任何其他引用。在某个时候,垃圾收集器将回收它们。
实例来讲解希望应该发生什么:
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。
什么?当它超出范围时它将变得“不可用”。它的范围是什么?静态的?然后它不会超出范围... – 2010-06-20 02:06:40
假设你没有分配任何非托管资源,垃圾收集器应该及时处理它(只要它想要,但它会回收该内存 - 不需要强制收集)。 – Pwninstein 2010-06-20 02:08:32
这听起来像你根本不明白垃圾收集。在你开始做.NET为你做的事情之前,你应该直截了当。 – 2010-06-20 03:14:56