Есть ли слабые ссылки в .NET? - PullRequest
4 голосов
/ 07 декабря 2008

Я хотел бы сохранить список определенного класса объектов в моем приложении. Но я все еще хочу, чтобы объект собирали мусор. Можете ли вы создать слабые ссылки в .NET?

Для справки:

Ответ от MSDN:

Чтобы установить слабую ссылку с объект, вы создаете WeakReference используя экземпляр объекта, который будет отслеживаются. Затем вы устанавливаете цель свойство этого объекта и установить возражать против нуля. Для примера кода увидеть WeakReference в классе библиотека.

Ответы [ 4 ]

12 голосов
/ 07 декабря 2008

Да, есть общий слабый ссылочный класс.

MSDN> Слабая ссылка

5 голосов
/ 07 декабря 2008

Можете ли вы создать слабые ссылки в .NET?

Да:

WeakReference r = new WeakReference(obj);

Использует System.WeakReference.

3 голосов
/ 07 декабря 2008

Да ...

Здесь можно найти довольно хороший пример:

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 считается сильной ссылкой и не будет собираться до тех пор, пока она больше не будет использоваться. Если вы хотите сохранить ссылку после области, вы можете установить ее в переменную-член.

0 голосов
/ 10 декабря 2008

Вот полный (не ориентированный на многопотоковое исполнение) пример реализации WeakReference

ClassA objA = new ClassA();
WeakReference wr = new WeakReference(objA);
// do stuff 
GC.Collect();
ClassA objA2;
if (wr.IsAlive)
    objA2 = wr.Target as ClassA; 
else
    objA2 = new ClassA(); // create it directly if required

WeakReference находится в пространстве имен System, поэтому нет необходимости включать какую-либо специальную сборку для него.

...