Если завершенный объект находится в памяти и не используется, он будет занимать много системных ресурсов, поэтому сборщик мусора .net поместит его в очередь прерывания. Как только наступит подходящее время, объект будет разбужен и вызовет его. Finalize, чтобы полностью завершить его. Однако, используя этот механизм, вы можете поместить ресурсоемкий гигантский класс в пул объектов и повторно использовать его на протяжении всего времени жизни программы (конечная отметка — это то, что clr считает, что в файле нет корня). процесс для этого приложения). Мы называем эти гигантские классы дорогими объектами. Давайте обсудим структуру пула объектов, который управляет дорогими объектами.
Класс Дорогой {
Статический пул стека = новый стек();
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 e = Expensiv. GetObjectFromPool();
//Вы можете использовать e ниже.Expensive.shutdownThepool
();//Перед закрытием приложения, закройте пул объектов, иначе в памяти останется "дыра", т.к. Finalize переписан
}
}