Tuve problemas para encontrar una buena manera de expresar esta pregunta, así que permítanme explicar por ejemplo:¿La referencia a un delegado constituye una referencia a un objeto (para evitar la recolección de basura)?
Supongamos que tengo alguna interfaz. En aras de la simplicidad, diré que la interfaz es IRunnable
, y proporciona un único método, Run
. (Esto no es real, es solo un ejemplo.)
Ahora, supongamos que tengo alguna clase preexistente, llamémosla Cheetah
, que no puedo cambiar. Existió antes de IRunnable
; No puedo hacer implementar mi interfaz. Pero quiero usarlo como si implementa IRunnable
- presumiblemente porque tiene un método Run
, o algo así. En otras palabras, quiero poder tener un código que espera un IRunnable
y funcionará con un Cheetah
.
OK, así que siempre podría escribir un tipo de oferta de CheetahWrapper
. Pero cómprame y déjame escribir algo un poco más flexible: ¿qué tal un RunnableAdapter
?
Preveo la definición de clase como algo parecido a esto:
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();
}
}
bastante sencillo, ¿verdad? Así que con esto, yo debería ser capaz de hacer una llamada como ésta:
Cheetah c = new Cheetah();
RunnableAdapter ra = new RunnableAdapter(c.Run);
Y ahora, voila: Tengo un objeto que implementa IRunner
y es, en su corazón de corazones, un Cheetah
.
Mi pregunta es: si este Cheetah
mío cae fuera de alcance en algún momento, y llega al punto en que normalmente sería basura recolectada ... ¿o sí? ¿O esta propiedad RunnableAdapter
del objeto Runner
constituye una referencia al Cheetah
original, por lo que no se recogerá? Ciertamente quiero que esa referencia sea válida, así que básicamente me pregunto si la definición de clase anterior es suficiente o si sería necesario mantener una referencia al objeto subyacente (como a través de una propiedad privada UnderlyingObject
), solo para evitar la recolección de basura .
¿Este idioma es C#? – Grumdrig
Guau, bastante ridículo Olvidé poner esas etiquetas ... sí, arreglado. –