Да ...
Здесь можно найти довольно хороший пример:
http://web.archive.org/web/20080212232542/http://www.robherbst.com/blog/2006/08/21/c-weakreference-example/
В вашем классе вы создали две переменные-члены:
WeakReference _weakRef = null;
Person _strongRef = null;
Вы создали два новых объекта Person
(это простые объекты, которые я только что создал для этого примера, состоящие из свойства Name
и некоторого кода отслеживания ссылок). Затем вы устанавливаете переменные-члены для вновь созданных экземпляров объектов Person
.
_strongRef = p;
_weakRef = new WeakReference(p1);
Разница здесь, вы заметите, что _strongRef
это просто обычная нормальная ссылка, тогда как _weakRef
установлен на WeakReference
объект с объектом person (p1)
, переданным в качестве параметра в конструктор.
Если собиралась сборка мусора или просто для целей тестирования, вы вызывали ее самостоятельно:
GC.Collect();
Тогда целевой объект p1
, который содержится в переменной-члене _weakRef
, должен быть подвергнут сборке мусора. Вы можете написать код для проверки:
if (_weakRef.IsAlive)
Если WeakReference
еще жив, вы можете преобразовать WeakReference
в сильную или нормальную ссылку, используя такой код:
Person p = _weakRef.Target as Person;
Теперь ссылка p
считается сильной ссылкой и не будет собираться до тех пор, пока она больше не будет использоваться. Если вы хотите сохранить ссылку после области, вы можете установить ее в переменную-член.