В .net 4.0 существует тип ConditionalWeakTable
, который может использоваться, хотя и несколько неловко, для запроса уведомления, когда произвольный объект становится подходящим для завершения. Если ConditionalWeakTable
содержит запись, отображающую один объект (скажем, 451-й созданный объект) на другой объект (скажем, 730-й созданный объект), то пока запись остается в таблице, а корневые ссылки существуют как на таблицу, так и на объект # 451, таблица будет считаться корневой ссылкой на объект # 730. Если корневая ссылка на объект # 451 отсутствует, таблица перестанет быть корневой ссылкой на объект # 730.
Следовательно, если объект № 730 содержит ссылку на таблицу и объект № 730 существует вне таблицы, объект № 730 получит право на финализацию одновременно с объектом № 451. Если объект # 730 переопределяет Finalize()
, это переопределение можно использовать как уведомление о том, что объект # 451 получил право на финализацию.
Обратите внимание, что финализатор для объекта # 730 сработает только один раз, даже если объект # 451 воскресит себя и перерегистрирует для завершения. Можно было бы написать код, который бы запускал уведомление примерно в то время, когда объект # 451 действительно становится мертвым и похороненным, даже если он сначала воскрешается несколько раз, но нет особо чистого способа сделать это.