2009-11-12 16 views
6

Ho avuto problemi a trovare un buon modo per formulare questa domanda, quindi vorrei provare a spiegare con l'esempio:Un riferimento a un delegato costituisce un riferimento a un oggetto (per impedire la garbage collection)?

Supponiamo che io abbia qualche interfaccia. Per semplicità, dirò che l'interfaccia è IRunnable e fornisce un singolo metodo, Run. (Questo non è reale, è solo un esempio.)

Ora, supponiamo di avere qualche classe preesistente, chiamiamola Cheetah, che non posso cambiare. Esisteva prima dello IRunnable; Non posso fare implementare la mia interfaccia. Ma voglio usarlo come se implementa IRunnable - presumibilmente perché ha un metodo Run o qualcosa del genere. In altre parole, voglio essere in grado di avere un codice che si aspetta un IRunnable e funzionerà con uno Cheetah.

OK, quindi potrei sempre scrivere una sorta di accordo CheetahWrapper. Ma umorami e lascia che io scriva qualcosa di un po 'più flessibile - che ne dici di uno RunnableAdapter?

Mi immagino la definizione di classe come qualcosa di simile a questo:

public class RunnableAdapter : IRunnable { 
    public delegate void RunMethod(); 

    private RunMethod Runner { get; set; } 

    public RunnableAdapter(RunMethod runner) { 
     this.Runner = runner; 
    } 

    public void Run() { 
     Runner.Invoke(); 
    } 
} 

abbastanza semplici, giusto? Quindi, con questo, dovrei essere in grado di effettuare una chiamata in questo modo:

Cheetah c = new Cheetah(); 
RunnableAdapter ra = new RunnableAdapter(c.Run); 

E ora, voilà: ho un oggetto che implementa IRunner ed è, nel suo cuore, un Cheetah.

La mia domanda è: se questo Cheetah della mia cade fuori dal campo di applicazione ad un certo punto, e arriva al punto in cui normalmente verrebbe raccolta della spazzatura ... lo sarà? Oppure questa proprietà dell'oggetto Runner costituisce un riferimento all'originale Cheetah, in modo che non venga raccolto? Voglio certamente che quel riferimento rimanga valido, quindi fondamentalmente mi chiedo se la suddetta definizione di classe sia sufficiente o se sia necessario mantenere un riferimento all'oggetto sottostante (come tramite alcune proprietà private UnderlyingObject), solo per evitare la garbage collection .

+0

Questa lingua è C#? – Grumdrig

+0

Wow, abbastanza ridicolo ho dimenticato di mettere quei tag ... sì, risolto. –

risposta

7

Sì, quel riferimento rimane valido e può infatti essere recuperato utilizzando la proprietà Delegate.Target - nel codice, come ra.Runner.Target.

1

In caso contrario, sembra un raccoglitore di rifiuti rotto.

1

Sì, il delegato conta come riferimento. Il tuo oggetto non sarà garbage collection fino a quando il delegato è anche irraggiungibile.

Problemi correlati