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