2011-10-26 19 views
12

Supponiamo di avere 2 classi, Foo e Bar. Foo non ha (e non può avere) una relazione con Bar.C#: crea un riferimento forte tra gli oggetti, senza un riferimento all'altro

Tuttavia, voglio che l'istanza di una barra resti attiva, a condizione che l'istanza di foo rimanga attiva. C'è un modo per farlo, senza usare effettivamente la barra di riferimento?

Grazie, Koen

+2

Quando si sta tentando di modificare il modo in cui il garbage collector funziona, probabilmente si dovrebbe dare un'occhiata al proprio progetto e vedere se può essere modificato per funzionare all'interno della lingua. Detto questo: domanda interessante! =) – Jens

+0

Perché rendi la vita difficile rifiutando la soluzione banale? –

+0

@DavidHeffernan Sembra che abbiano qualche tipo di problema di dipendenza che impedisce loro di farlo. – Steve

risposta

16

Date un'occhiata al ConditionalWeakTable Class.

Consente ai compilatori di allegare dinamicamente campi oggetto a oggetti gestiti.

È essenzialmente un dizionario in cui sia la chiave che il valore sono WeakReference e il valore viene mantenuto attivo finché la chiave è attiva.

Ad esempio, è possibile definire un

ConditionalWeakTable<Foo, Bar> table 

e aggiungere un paio/Bar Foo. L'istanza Barra viene mantenuta attiva finché esiste un riferimento all'istanza Foo. Puoi trovare l'istanza Bar per l'istanza di Foo guardando la tabella.

+0

La magia perfetta, funziona come un incantesimo, grazie! – KoenJ

0

È difficile dare suggerimenti senza sapere esattamente cosa si sta cercando di raggiungere, o cosa intendi con "vivo". Normalmente non dovresti preoccuparti della durata degli oggetti gestiti: "muoiono" naturalmente quando non vengono più referenziati.

Ma per fare ciò che sembra, l'istanza deve fare riferimento all'istanza Bar o qualche altro oggetto deve fare riferimento a entrambi per creare il collegamento. Potrebbe essere un riferimento a un'istanza Bar come System.Object, ad esempio Foo non è necessario conoscere il tipo Bar.

0

La barra non può essere finalizzata solo se QUALCOSA ha un riferimento ad essa. Fai in modo che Foo dica quella cosa quando può lasciare andare Bar.

+0

"Foo non ha (e non può avere) una relazione con Bar" .. –

0

È possibile creare un oggetto pubblico denominato BarRiferimento nel tipo Foo?
Qualcuno al di fuori di Foo dovrebbe impostare la corretta istanza di Bar su questa proprietà.
Finché c'è un riferimento all'istanza della barra non sarà GCed E l'utilizzo di oggetto Foo non conosce nulla sul tipo di Barra.

+0

"Foo non ha (e non può avere) una relazione con Bar" –

+0

** Tipo ** Foo non ha relazione con ** tipo ** Bar se usi l'oggetto come suggerisco io. Se non ci dovrebbe essere nessuna relazione _semantica_ questo è un altro caso. – ViktorZ

Problemi correlati