所以,我有這個項目創建一個類的多個實例,並列出它們。如何刪除一個類的實例?
在某些時候,實例類不再需要了。我怎麼沖洗它?
到目前爲止,即使類再也沒有任何東西了(如果它是單個靜態類,程序會關閉),它仍然不在我的列表中,它的公共變量仍然可用...
所以,我有這個項目創建一個類的多個實例,並列出它們。如何刪除一個類的實例?
在某些時候,實例類不再需要了。我怎麼沖洗它?
到目前爲止,即使類再也沒有任何東西了(如果它是單個靜態類,程序會關閉),它仍然不在我的列表中,它的公共變量仍然可用...
你可以讓你的實例引發一個事件(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