2013-07-09 4 views
5

So conoscenza seguito:Qual è la differenza tra riferimento debole breve e riferimento debole lungo?

Un riferimento debole consente il garbage collector per raccogliere l'oggetto pur consentendo l'applicazione per accedere all'oggetto.

Quindi se l'oggetto è stato recuperato, è necessario crearlo nuovamente quando necessario.

Quindi, qual è la differenza tra riferimento debole breve e riferimento lungo debole? Penso come qui sotto: (secondo MSDN)

breve riferimento debole: se GC recuperare l'oggetto, l'oggetto è davvero rilasciato.

lungo riferimento debole: se GC reclamare l'oggetto, l'oggetto è ancora esistente (come è memorizzato nella cache).

Quindi qualcuno può dirmi più dettagli?

+1

è ben spiegata qui: http://stackoverflow.com/questions/310685/weak-references –

risposta

5

Breve

L'obiettivo di un breve riferimento debole diventa nullo quando l'oggetto è recuperato dalla garbage collection. Il riferimento debole è esso stesso un oggetto gestito ed è soggetto alla garbage collection proprio come qualsiasi altro oggetto gestito . Un breve riferimento debole è il costruttore predefinito per WeakReference.

lunga

viene mantenuta Una lunga riferimento debole dopo metodo Finalize dell'oggetto è stato chiamato. Ciò consente di ricreare l'oggetto, ma lo stato dell'oggetto rimane imprevedibile. Per utilizzare un riferimento lungo, specificare true nel costruttore WeakReference.

Se il tipo di oggetto non ha un metodo Finalize, la funzionalità riferimento breve debole applica ed il riferimento debole è valido solo finché il bersaglio viene raccolta, che può verificarsi in qualsiasi momento dopo il finalizzatore viene eseguito.

Per stabilire un riferimento forte e utilizzare di nuovo l'oggetto, assegnare la proprietà di destinazione di destinazione a WeakReference al tipo dell'oggetto. Se la proprietà Target restituisce null, l'oggetto è stato raccolto; altrimenti, è possibile continuare a utilizzare l'oggetto poiché l'applicazione ha riguadagnato un forte riferimento ad esso.

Indicazioni per l'uso Riferimenti deboli

uso a lungo riferimenti deboli solo quando è necessario, come lo stato dell'oggetto è imprevedibile dopo la finalizzazione. Evitare l'uso di riferimenti deboli a oggetti di piccole dimensioni poiché il puntatore stesso potrebbe essere uguale a o superiore.

Evitare l'uso di riferimenti deboli come soluzione automatica alla memoria problemi di gestione. Invece, sviluppare una politica di caching efficace per gestire gli oggetti dell'applicazione.

Reference

+0

ho già noto questo articolo, ma la mia domanda è se GC recuperare l'oggetto, l'oggetto è ancora esistito ??? –

+1

Mi chiedo perché quel documento descrive così male cosa sta realmente accadendo? Un riferimento debole breve sarà invalidato quando il suo target diventa idoneo per la finalizzazione immediata o cessa di esistere, o quando il riferimento debole * stesso * diventa idoneo per la finalizzazione. Un riferimento lungo e debole verrà invalidato quando il suo target cessa di esistere o quando il riferimento debole stesso diventa idoneo per la finalizzazione. Nota che i riferimenti deboli possono essere invalidati anche mentre i loro bersagli sono vivi - un punto non menzionato nella documentazione! – supercat