Слабые ссылки в.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

Одна из главных побед при их использовании - подписка на события. Также для кэшей объектов.

Другие вопросы по тегам