2009-03-31 11 views
8
public sealed class FtpManager 
{ 
    public event EventHandler LoggingIn = delegate { }; 
    private void OnLoggingIn(object sender, EventArgs e) 
    { 
     var handler = LoggingIn; 
     handler(sender, e); 
    } 
// ... 
} 

En el código anterior, he inicializado el controlador de eventos LoggingIn con un delegado vacío.

¿Afectará el espacio de memoria utilizado de alguna manera? ¿Especialmente cuando hay cientos o miles de eventos declarados de esta manera?¿Un delegado vacío se comerá la memoria?

+0

No se olvide de la llamada de método adicional involucrada. Llamarás tanto al manejador de eventos como a un método vacío que asignas a través del delegado anónimo. No he realizado ninguna prueba, pero al menos deberías saberlo ... –

Respuesta

13

Raspe la respuesta anterior (se guarda a continuación para la posteridad). Depende de la implementación del compilador, pero bajo el compilador MS C# 3.0 actual, esto realmente solo crea una instancia única que se reutiliza para cada instancia. Puede hacerlo porque los delegados son inmutables y ese delegado no requiere ninguna información de la instancia.

No sé si este fue el caso con C# 2.0. Puede descompilar su código y ver si el IL realmente usa un campo en caché o no. Usar la respuesta a continuación es una forma segura de garantizar aunque solo creará una instancia.

Respuesta original:

Sí, se crea una instancia de un delegado. Eso llevará algo de memoria. Sin embargo, puede reducir eso:

public static class EventHandlers 
{ 
    public static readonly EventHandler Empty = delegate {}; 
} 

public sealed class FtpManager 
{ 
    public event EventHandler LoggingIn = EventHandlers.Empty; 
} 

En ese momento solo habrá una instancia y podrá consultarla desde cualquier lugar. La desventaja es que otras clases podrían darse de baja usando el mismo controlador. Si confías en que el resto de tu código base no lo haga, esta es probablemente la mejor apuesta desde el punto de vista de la memoria.

+0

Vaya, creo que una parte de la razón por la que mi aplicación se está volviendo loca con el uso de memoria podría ser porque he estado declarando eventos con un vacío delegar...; gracias de nuevo, Jon – Sung

+0

@Sung: He cambiado por completo mi respuesta. Volveremos y editaremos para poner la versión anterior también! –

+0

@Sung: Bien, ahora es mucho más completo. Debería poder verificar si este es su problema descompilando su aplicación. El reflector es bueno para esto, pero tendrás que mirar el IL para estar seguro de lo que realmente está sucediendo. –

-1

La alternativa a hacer esto es verificar LoggingIn para la nulidad cada vez que quiera subirlo. Es probable que requiera más memoria que llamar a un delegado vacío.

+0

¿Hizo alguna prueba para respaldar esto, o es solo una suposición? –

+0

No. Acabo de señalar un factor limitante. Si quería pruebas, podría haberlas escrito tan fácilmente como cualquier otra persona. –

Cuestiones relacionadas