2010-06-20 130 views
3

所以,我有這個項目創建一個類的多個實例,並列出它們。如何刪除一個類的實例?

在某些時候,實例類不再需要了。我怎麼沖洗它?

到目前爲止,即使類再也沒有任何東西了(如果它是單個靜態類,程序會關閉),它仍然不在我的列表中,它的公共變量仍然可用...

+0

什麼?當它超出範圍時它將變得「不可用」。它的範圍是什麼?靜態的?然後它不會超出範圍... – 2010-06-20 02:06:40

+1

假設你沒有分配任何非託管資源,垃圾收集器應該及時處理它(只要它想要,但它會回收該內存 - 不需要強制收集)。 – Pwninstein 2010-06-20 02:08:32

+2

這聽起來像你根本不明白垃圾收集。在你開始做.NET爲你做的事情之前,你應該直截了當。 – 2010-06-20 03:14:56

回答

3

你可以讓你的實例引發一個事件(OnInactivated,比如說)。當項目添加到列表(子類或封裝列表並重寫Add方法)時,列表類應爲這些事件添加處理程序。事件觸發時,該對象將通過列表從列表中刪除。假設該對象沒有在任何其他列表中被引用(這可能也在監聽),那麼垃圾收集器可以自由處理該對象。

這樣,對象不需要跟蹤所有對自身的引用,並知道如何通知引用持有者釋放引用。

這裏有一個可運行的例子:http://www.coderun.com/ide/?w=Hw83i0wAQkugUif5Oj2lmw

+0

+1我在@ Brian的回答中發佈了類似於此的消息。 – slugster 2010-06-20 02:38:32

+0

謝謝,這是有道理的,我會盡力實現。 – Ben 2010-06-20 03:44:04

+1

@Ben - 我已經添加了一個可運行示例的鏈接。 – 2010-06-20 17:22:33

4

爲什麼要關注它呢?爲什麼不讓.Net Garbage Collection做到這一點?

Altenatively你可以實現IDisposable和呼叫

MyClass.Dispose(); 

UPDATE:聽起來你想自定義集合,而不是一個列表,將只返回活動類。創建一個名爲MyClassCollection的新類,實現ICollection並確保它只返回活動類

+0

我需要該列表是最新的只有活動類,並忽略不活動的類。 – Ben 2010-06-20 02:08:05

+0

@你是什麼意思的「積極班」? – Pwninstein 2010-06-20 02:11:01

4

您的問題意味着您將這些實例列入某種列表中。從列表中刪除不再需要的實例,確保您沒有任何其他引用。在某個時候,垃圾收集器將回收它們。

+0

因此,變爲非活動狀態的類需要以某種方式通知擁有該列表的類以將其從中移除...所以垃圾回收器可以處理它...錯誤...對嗎? :) – Ben 2010-06-20 02:10:29

+0

如果這就是你的應用程序的組織方式,是的。 – 2010-06-20 02:13:58

+1

@本,也許你沒有給我們所有的信息?我們如何知道這些課程何時變得不活躍?如果對象要舉辦一個活動說*「嗨,我沒有更多的工作要做,我不再活躍」*? – slugster 2010-06-20 02:37:45

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); 
    } 
} 
0

一個更通用的解決方案參考對象,而不會阻止其垃圾回收是使用WeakReference

相關問題