Wird ein leerer Delegierter Speicher auffressen?

8
%Vor%

Im obigen Code habe ich den LoggingIn -Ereignishandler mit einem leeren Delegaten initialisiert Wirkt sich das auf den Speicherplatz aus? Vor allem, wenn es Hunderte oder Tausende solcher Ereignisse gibt?

    
Sung 31.03.2009, 20:54
quelle

2 Antworten

13

Scratch die vorherige Antwort (unten für die Nachwelt gehalten). Es hängt von der Implementierung des Compilers ab, aber unter dem aktuellen MS C # 3.0-Compiler erstellt das tatsächlich nur eine einzelne Instanz, die für jede Instanz wiederverwendet wird. Dies ist möglich, da Delegaten unveränderlich sind und dieser Delegat keine Informationen von der Instanz benötigt.

Ich weiß nicht, ob das bei C # 2.0 der Fall war. Sie können Ihren Code dekompilieren und sehen, ob die IL tatsächlich ein zwischengespeichertes Feld verwendet oder nicht. Die Verwendung der folgenden Antwort ist eine sichere Möglichkeit, garantieren Sie werden nur eine Instanz erstellen.

Ursprüngliche Antwort:

Ja, es erstellt eine Instanz eines Delegaten. Das wird etwas Speicher brauchen. Sie könnten das jedoch reduzieren:

%Vor%

An diesem Punkt wird es nur die eine Instanz geben, und Sie können sich von überall darauf beziehen. Der Nachteil ist, dass andere Klassen sich dann mit demselben Handler abmelden konnten. Wenn Sie dem Rest Ihrer Codebasis das nicht anvertrauen, ist dies aus Sicht des Speichers wahrscheinlich die beste Wahl.

    
Jon Skeet 31.03.2009, 21:00
quelle
-1

Die Alternative dazu besteht darin, LoggingIn jedes Mal auf Nichtigkeit zu prüfen, wenn Sie es erhöhen möchten. Das ist wahrscheinlich speicherintensiver als ein leerer Delegierter aufzurufen.

    
Yes - that Jake. 31.03.2009 21:06
quelle