Слабые ссылки в.net
Может кто-нибудь привести примеры использования слабых ссылок в проектах.net?
5 ответов
Подумайте о кеше с 2 уровнями. Таким образом, на объекты 1-го уровня ссылаются обычные ссылки, а на 2-м уровне - слабые ссылки. Таким образом, если вы хотите закончить свой объект с 1-го уровня, вы можете поместить его на 2-й уровень.
В следующий раз, когда клиент попытается получить доступ к этому объекту, если у вас достаточно памяти, объект будет перемещен со 2-го уровня, однако, если памяти недостаточно и объект был собран, вам придется воссоздать ваш объект. Иногда он будет воссоздан или извлечен из дорогого магазина, но в некоторых ситуациях вы сможете найти его на 2-м уровне.
В одном сценарии вы хотите, чтобы объект имел одноэлементное поведение, но вы не хотите, чтобы он всегда оставался с долговременной ссылкой. Например:
class ExpensiveSingleton
{
private static WeakReference _instanceWeakRef;
private ExpensiveSingleton() { ... your expensive ctor ... }
public static ExpensiveSingleton Instance
{
get
{
ExpensiveSingleton reference = null;
if(_instanceWeakRef != null)
reference = _instanceWeakRef.Target as ExpensiveSingleton; // Try a cheap access
if(reference == null)
{
reference = new ExpensiveSingleton(...); // Pay the cost
_instanceWeakRef = new WeakReference(newInstance);
}
return reference;
}
}
}
(Для краткости это не было сделано потокобезопасным)
Это гарантирует, что все сильные ссылки, которые вы получаете на этот объект, являются одним и тем же объектом, и что, когда все сильные ссылки исчезнут, этот объект в конечном итоге будет собран.
На странице msdn есть хороший пример WeakReference, пример кода, который реализует кэширование.
Несколько хороших статей:
http://www.switchonthecode.com/tutorials/csharp-tutorial-weak-references
http://www.dotnetperls.com/weakreference
http://www.codeproject.com/KB/dotnet/WeakReference.aspx
Одна из главных побед при их использовании - подписка на события. Также для кэшей объектов.