.NET 強(qiáng)引用與弱引用
- 強(qiáng)引用
如果應(yīng)用程序的代碼可以訪問一個(gè)正由該程序使用的對象,垃圾回收器就不能收集該對象, 那么,就認(rèn)為應(yīng)用程序?qū)υ搶ο缶哂袕?qiáng)引用。
要建立強(qiáng)引用并重新使用該對象,請將 WeakReference 的 Target 屬性強(qiáng)制轉(zhuǎn)換為該對象的類型。如果 Target 屬性返回 null,則表示對象已被收集;否則,您可繼續(xù)使用該對象,因?yàn)閼?yīng)用程序已重新獲得了對它的強(qiáng)引用。
- 弱引用
弱引用允許應(yīng)用程序訪問對象,同時(shí)也允許垃圾回收器收集相應(yīng)的對象。如果不存在強(qiáng)引用,則弱引用的有限期只限于收集對象前的一個(gè)不確定的時(shí)間段。
使用弱引用時(shí),應(yīng)用程序仍可對該對象進(jìn)行強(qiáng)引用,這樣做可防止該對象被收集。但始終存在這樣的風(fēng)險(xiǎn):垃圾回收器在重新建立強(qiáng)引用之前先處理該對象。
要對某個(gè)對象建立弱引用,請使用要跟蹤的對象的實(shí)例創(chuàng)建一個(gè) WeakReference。 然后將 Target 屬性設(shè)置為該對象,將該對象設(shè)置為 null。
- 適合弱引用的對象
- 占用大量內(nèi)存,但通過垃圾回收功能回收以后很容易重新創(chuàng)建。
- 弱引用分類
- Short 垃圾回收功能回收對象后,短弱引用的目標(biāo)會(huì)變?yōu)?null。弱引用本身是托管對象,和任何其他托管對象一樣需要經(jīng)過垃圾回收。短弱引用是 WeakReference 的默認(rèn)構(gòu)造函數(shù)。
- Long
調(diào)用對象的 Finalize 方法后,會(huì)保留長弱引用。這樣,您就可以重新創(chuàng)建該對象,但該對象仍保持不可預(yù)知的狀態(tài)。要使用長引用,請?jiān)?WeakReference 構(gòu)造函數(shù)中指定 true。如果對象的類型沒有 Finalize 方法,則會(huì)應(yīng)用短弱引用功能,該弱引用只在目標(biāo)被收集之前有效,運(yùn)行終結(jié)器之后可以隨時(shí)收集目標(biāo)。
- 弱引用使用準(zhǔn)則
- 僅在必要時(shí)使用長弱引用,因?yàn)樵诮K止后對象的狀態(tài)是不可預(yù)知的
- 避免對小對象使用弱引用,因?yàn)橹羔槺旧砜赡芎蛯ο笠粯哟螅蛘弑葘ο筮€大
- 不應(yīng)將弱引用作為內(nèi)存管理問題的自動(dòng)解決方案,而應(yīng)開發(fā)一個(gè)有效的緩存策略來處理應(yīng)用程序的對象。