tutorial metodo expresiones delegados anonimo c# events delegates lambda anonymous-methods

metodo - linq lambda c#



Manejadores de sucesos y delegados anĂ³nimos/Expresiones Lambda (3)

Creo que el problema es que parece proceder de la suposición de que tener un delegado asignado al evento de un objeto impide que se pueda censurar.

Esto como una declaración simple no es verdad.

Dicho esto, el problema percibido desaparece.

Inicialmente en la recolección de basura todo es basura. El GC se ejecuta a través de todo lo que actualmente está disponible globalmente y en cada pila y de estos esos otros objetos a los que hacen referencia, y así sucesivamente, marcando cada uno como no basura.

¿Cómo lograría un proceso de gráficos así llegar a este objeto?

Espero aclarar algunas cosas con los delegados anónimos y las expresiones lambda que se utilizan para crear un método para los manejadores de eventos en C #; para mí al menos.

Supongamos que tenemos un evento que agrega un delegado anónimo o una expresión lambda [para multitudes afortunadas que pueden usar versiones más nuevas de .NET].

SomeClass.SomeEvent += delegate(object o, EventArg e) { //do something };

He leído que las personas en el pasado se han olvidado de eventos que todavía tienen controladores que impiden que la clase sea recolectada. ¿Cómo se podría eliminar el controlador agregado sin establecer SomeEvent a null dentro de la clase? ¿No sería el siguiente un manejador completamente nuevo?

SomeClass.SomeEvent -= delegate(object o, EventArg e) { //do same thing };

Pude ver el almacenamiento de la expresión anónima delegado / lambda en una variable, pero eso, al menos para mí, parece frustrar todo el propósito de poder agregar de manera simple y concisa un controlador de eventos.

SomeEventDelegate handler = new SomeEventDelegate(delegate(object o, EventArg e) { //do same thing }); SomeClass.SomeEvent += handler; //... stuff SomeClass.SomeEvent -= handler;

Nuevamente, entiendo que podrías hacer ...

public override Dispose(bool disposing) { _someEvent = null; this.Dispose(); }

Pero soy más interesante con solo eliminar el método creado dinámicamente del Evento. Espero que alguien pueda arrojar algo de luz sobre esto para mí. ¡Gracias!


Si el objeto X tiene un controlador de eventos cuyo objetivo es el objeto Y, entonces el objeto X está vivo significa que el objeto Y no puede ser recolectado como basura. No impide que el objeto X sea recolectado como basura.

Normalmente, cuando se desecha algo, se convertirá en basura muy pronto de todos modos, lo que significa que no tienes ningún problema.

El problema con los eventos y el GC es si olvida eliminar un controlador suscrito de un objeto diferente , es decir, tiene un detector que está dispuesto, pero nunca será un archivo basura porque todavía hay una referencia del evento en un objeto diferente.


No puedes.

Al igual que no puede crear un tipo anónimo fuera de su alcance (a excepción de algunos trucos de compilación).

Es por eso que se llama anónimo.

Tienes que guardar una referencia en alguna parte ... o usar la reflexión.