Independientemente de lo que pregunte, la respuesta técnica a su pregunta es "no". Técnicamente, a menos que descubras un error en el CLR, no hay verdaderas "fugas de memoria" con los objetos administrados (eso es una gran parte de lo que los convierte en una buena cosa). Para responder a lo que creo que en realidad está pidiendo, sin embargo, parece que usted está pidiendo una de dos cosas:
- ¿Hay algo que hay que hacer con los eventos que no tienen ningún delegados adscrito a los mismos ?
- ¿Puede un evento evitar que el recolector de basura limpie los objetos?
La respuesta a la primera pregunta es simplemente "no". Muévete, nada que ver aquí.
La respuesta a la segunda se ha discutido extensamente aquí en SO y otras áreas de la web. La versión corta es que un controlador de eventos adjunto significa que el GC considerará la instancia de destino como "alcanzable" por la instancia de activación de eventos. Este puede hacer que los objetos permanezcan en la memoria más tiempo de lo esperado, ya que esta accesibilidad es algo transparente para el usuario (desarrollador) debido a la forma en que se construyen los delegados.
En otras palabras, supongamos que tengo dos objetos: Productor y Consumidor. El productor dispara un evento que el Consumidor ... consume.
public class Producer
{
public event EventHandler OmgIDidSomething;
}
public class Consumer
{
public void AttachTo(Producer producer)
{
producer.OmgIDidSomething += new EventHandler(producer_OmgIDidSomething);
}
private void producer_OmgIDidSomething(object sender, EventArgs e)
{
// ...
}
}
En este ejemplo, cualquier instancia de Consumer
donde AttachTo
se llama permanecerá accesible en cuanto a la GC es que se trate hasta la instancia de Producer
que concede a es elegible para la recolección, debido a que el delegado detrás de la puesta en práctica de el evento OmgIDidSomething
tiene una referencia a la instancia de Consumer
a la que corresponde.
¿Qué estás preguntando? – SLaks
¿Te refieres a un evento que no se quita? – Bobby
¿Está preguntando sobre eventos/delegados que tienen una lista de invocación vacía? – Oded