2013-12-13 3 views
-1

УчитываяGarbage Collection объект установка на нуль

public class A 
{ 
public B First { get; set; } 
}  
public class B 
{ 
public C Second { get; set;} 
} 
public class C 
{ 
public D Third { get; set; } 
} 

И где-то в классе у вас есть это

var testClass = new A(); 
//All the properties have values in it and the class D has a property value that it is holding in to the memory 
//testClass.B = new B(); 
//etc.. 

Что произойдет, если вы сделали testClass = null? Что касается ссылки testClass на кучу? А как насчет D, который держит ценность, которую он не может собрать?

EDIT: Просто уточнить, учитывая, что D имеет событие, которое не было отписано и имеет 10 000 обработчиков. Что происходит с testClass = null?

ответ

3

Когда вы выполняете testClass = null, объект остается в куче. Но в вашем коде больше нет ссылки на него. Он имеет право на сбор мусора.

Любые объекты, которые являются полями A, больше не будут упоминаться нигде. Они также будут иметь право на сбор мусора .. и так далее.

(Как это бывает, в вашем конкретном коде никогда не назначаются поля First, Second и Third. Они по-прежнему равны нулю, поэтому они не имеют никакого отношения к обсуждению).

Обратите внимание, что эта коллекция, вероятно, не произойдет сразу - установка testClass = null не вызовет сборку сама по себе.

Если D ссылается на неуправляемые ресурсы, то он будет по-прежнему иметь право на сбор мусора, если вы установите testClass = null. Но если D не реализует Finalizer (который явно очищает неуправляемые ресурсы), тогда он будет протекать.

Если D - это событие с большим количеством подписчиков, то D по-прежнему будет иметь право на GC, даже если вы никогда явно не подписываетесь. См. Этот ответ here.

После этого, если сами подписки являются объектами, которые больше не упоминаются нигде, тогда они также будут иметь право на сбор.

+0

Что делать, если одно из его свойств ссылается на значение, которое оно не может собрать? Как класс, который он ссылается, и внутри него неуправляемый код? И я опустил значения, но добавил там комментарий, что все свойства были назначены чему-то, а D ссылается на то, что в нем неуправляемый код, который он не может собрать. –

+1

@LeoLorenzoLuis - это будет утечка памяти, если класс с неуправляемой ссылкой не реализует финализатор. Хорошая ссылка: http://www.codeproject.com/Articles/319826/IDisposable-Finalizer-and-SuppressFinalize-in-Csha –

+0

@RobertLevy Обновлен мой вопрос, да, это мой вопрос, что произойдет, если я сделаю testData = null, и есть утечка памяти? –