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

Nel codice precedente, ho inizializzato il gestore di eventi LoggingIn con un delegato vuoto.

Ciò influenzerà in qualche modo lo spazio di memoria utilizzato? Soprattutto quando ci sono centinaia o migliaia di eventi dichiarati in questo modo?Un delegato vuoto mangerà memoria?

+0

Non dimenticare la chiamata di metodo aggiuntiva in questione. Chiamerai sia il gestore (i) dell'evento sia un metodo vuoto che assegni tramite il delegato anonimo. Non ho eseguito alcun test, ma almeno dovresti esserne a conoscenza ... –

risposta

13

Gratta la risposta precedente (mantenuta sotto per i posteri). Dipende dall'implementazione del compilatore, ma con l'attuale compilatore MS C# 3.0, in realtà questo crea solo una singola istanza che viene riutilizzata per ogni istanza. È in grado di farlo perché i delegati sono immutabili e il delegato non richiede alcuna informazione dall'istanza.

Non so se fosse il caso del C# 2.0. È possibile decompilare il codice e verificare se l'IL utilizza effettivamente un campo memorizzato nella cache o meno. Utilizzando la risposta di seguito è un modo sicuro per garantire si creerà solo un'istanza però.

risposta originale:

Sì, crea un'istanza di un delegato. Questo richiederà un po 'di memoria. Si potrebbe ridurre questo:

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

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

A quel punto ci sarà solo l'istanza, e si può fare riferimento da qualsiasi luogo. Lo svantaggio è che altre classi potrebbero quindi annullare l'iscrizione utilizzando lo stesso gestore. Se ti fidi che il resto della tua base di codice non lo faccia, questa è probabilmente la migliore scommessa dal punto di vista della memoria.

+0

Wow, penso che una parte del motivo per cui la mia app è in esecuzione con un utilizzo elevato della memoria potrebbe essere perché ho dichiarato eventi con un vuoto delegare...; grazie ancora, Jon – Sung

+0

@Sung: ho completamente cambiato la mia risposta. Tornerà e modificherà anche per mettere la versione precedente! –

+0

@Sung: Ok, ora è molto più completo. Dovresti essere in grado di verificare se questo è il tuo problema, decompilando la tua app. Reflector fa bene, ma dovrai controllare l'IL per essere sicuro di ciò che sta realmente accadendo. –

-1

L'alternativa a ciò è controllare LoggingIn per nullità ogni volta che si desidera sollevarlo. È molto più impegnativo in termini di memoria che chiamare un delegato vuoto.

+0

Hai eseguito qualche test per supportarlo o è solo un'ipotesi? –

+0

No. Ho appena indicato un fattore limitante. Se volevi dei test, avresti potuto scriverli con la stessa facilità di chiunque altro. –

Problemi correlati