一個被終止的物件常駐記憶體重而不被使用的話,會佔用很多系統資源,於是.net的垃圾回收器就會將它放在中止化佇列中,一旦時機成熟,該物件就會被喚醒,並且調用他的finalize方法,來徹底的終結他,但是利用這一機制,就可以將耗費資源的巨型類放入到一個對像池中,在程序的整個生存期內重複的使用他(結束的標誌是clr認為在進程中不存在任何該應用程式的根)。我們稱這些巨型類別為Expensive對象,以下來討論一下管理Expensive物件的物件池的結構。
Class Expensive{
Static Stack pool = new Stack();
Public static Expensive GetObjectFromPool(){
Retun (Expensive) pool.Pop();
}
Public static void ShutdownThePool(){
Pool = null;
}
Public Expensive(){
//先建構物件
Pool.push(this);
}
Finalize (){
If(pool!=null){
GC.RegisterForFinally(this;)/ /先把他叫醒挨宰
Pool.push(this);//將「清醒的」物件加入物件池,讓他起死回生
}
}
}
Class app{
Static void main(){
New expensive();
……
Expensive e = Expensiv. GetObjectFromPool();
//下面就可以使用e了
Expensive.shutdownThepool();//關閉應用程式前,先關閉物件池,否則會在記憶體中留下“孔洞”,因為Finalize已經被重寫了
}
}