.NET 強引用與弱引用
- 強引用
如果應用程序的代碼可以訪問一個正由該程序使用的對象,垃圾回收器就不能收集該對象, 那么,就認為應用程序對該對象具有強引用。
要建立強引用并重新使用該對象,請將 WeakReference 的 Target 屬性強制轉換為該對象的類型。如果 Target 屬性返回 null,則表示對象已被收集;否則,您可繼續(xù)使用該對象,因為應用程序已重新獲得了對它的強引用。
- 弱引用
弱引用允許應用程序訪問對象,同時也允許垃圾回收器收集相應的對象。如果不存在強引用,則弱引用的有限期只限于收集對象前的一個不確定的時間段。
使用弱引用時,應用程序仍可對該對象進行強引用,這樣做可防止該對象被收集。但始終存在這樣的風險:垃圾回收器在重新建立強引用之前先處理該對象。
要對某個對象建立弱引用,請使用要跟蹤的對象的實例創(chuàng)建一個 WeakReference。 然后將 Target 屬性設置為該對象,將該對象設置為 null。
- 適合弱引用的對象
- 占用大量內存,但通過垃圾回收功能回收以后很容易重新創(chuàng)建。
- 弱引用分類
- Short 垃圾回收功能回收對象后,短弱引用的目標會變?yōu)?null。弱引用本身是托管對象,和任何其他托管對象一樣需要經(jīng)過垃圾回收。短弱引用是 WeakReference 的默認構造函數(shù)。
- Long
調用對象的 Finalize 方法后,會保留長弱引用。這樣,您就可以重新創(chuàng)建該對象,但該對象仍保持不可預知的狀態(tài)。要使用長引用,請在 WeakReference 構造函數(shù)中指定 true。如果對象的類型沒有 Finalize 方法,則會應用短弱引用功能,該弱引用只在目標被收集之前有效,運行終結器之后可以隨時收集目標。
- 弱引用使用準則
- 僅在必要時使用長弱引用,因為在終止后對象的狀態(tài)是不可預知的
- 避免對小對象使用弱引用,因為指針本身可能和對象一樣大,或者比對象還大
- 不應將弱引用作為內存管理問題的自動解決方案,而應開發(fā)一個有效的緩存策略來處理應用程序的對象。