[C#] ¿Deben establecerse los eventos personalizados como nulos al desechar un objeto?


Answers

No. El objetivo delegado en el evento Broadcast hace referencia al objeto Listener. Eso mantendrá vivo el objeto Listener. El objeto Listener no tiene ninguna referencia de regreso al objeto Broadcast.

Cuidado con la terminología. La eliminación del objeto Broadcast no hace nada. Tiene que ser basura recolectada, lo cual solo puede suceder cuando no quedan referencias al objeto. Cuando eso suceda, el objeto delegado también se recopilará automáticamente, ya que la única referencia a él es la lista interna de destinos delegados mantenida por un objeto delegado de evento privado. Eso también elimina la referencia que el delegado tiene para el oyente. Si no hay otras referencias al oyente, se recopilará también. Si aún lo es, ya no recibirá notificaciones de eventos. Para resumir: no tiene que establecer explícitamente el evento como nulo en la clase Broadcast.

No exactamente igual en el oyente, se hace referencia por el evento al que está suscrito. Si se declara no apto para el negocio (desechado) pero la emisora ​​aún está en vivo, debe eliminar su suscripción al evento de manera explícita. La clase SystemEvents es una versión extrema de eso, sus eventos son estáticos. La activación de eventos en un delegado que hace referencia a un oyente dispuesto es algo que tiende a notar.

La mayoría de los modelos de objetos prácticos intentan garantizar que los objetos oyentes desaparezcan cuando el padre va. Windows Forms sería un buen ejemplo. No es necesario anular la suscripción de eventos explícitamente.

Question

Permite decir que tenemos 2 objetos, emisor y oyente. El locutor tiene un evento llamado Difusión al que está suscrito el Oyente. Si el Listener se elimina sin darse de baja del evento Broadcast, se mantendrá en la memoria debido al delegado del evento que lo referencia que Broadcaster contiene.

Lo que me llama la atención es si la emisora ​​está dispuesta sin la cancelación de la suscripción del oyente o si la configuración de la emisora ​​es Broadcast = null ¿se retendrá la emisora ​​en la memoria?

No he podido encontrar nada con una respuesta difícil a esta pregunta, excepto un blogger que cree que no establecer el evento en nulo mantendrá la fuente en la memoria (que se encuentra aquí ).

Me gustaría escuchar una explicación de por qué o por qué no.

Gracias.

ACTUALIZACIÓN: subproceso del foro donde un desarrollador indica que los eventos deben establecerse como nulos, pero Jon Skeet indica que no es necesario, pero no detalla.