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 .
Questa lingua è C#? – Grumdrig
Wow, abbastanza ridicolo ho dimenticato di mettere quei tag ... sì, risolto. –