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, weil Delegaten unveränderlich sind und dieser Delegat keine Informationen von der Instanz benötigt.
Ich weiß nicht, ob dies mit C# 2.0 obwohl 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 ein sicherer Weg zu Garantie Sie werden nur eine Instanz erstellen.
Ursprüngliche Antwort:
Ja, erstellt es eine Instanz eines Delegaten. Das wird etwas Speicher brauchen. Sie könnten das aber reduzieren:
public static class EventHandlers
{
public static readonly EventHandler Empty = delegate {};
}
public sealed class FtpManager
{
public event EventHandler LoggingIn = EventHandlers.Empty;
}
An diesem Punkt wird es nur die eine Instanz sein, und Sie können von überall darauf verweisen. Der Nachteil ist, dass andere Klassen sich dann mit demselben Handler abmelden konnten. Wenn Sie dem Rest Ihrer Codebasis vertrauen, dies nicht zu tun, ist dies aus Sicht des Speichers wahrscheinlich die beste Wahl.
Vergessen Sie nicht den zusätzlichen Methodenaufruf. Sie rufen sowohl die Ereignishandler als auch eine leere Methode auf, die Sie über den anonymen Delegaten zuweisen. Ich habe keine Tests ausgeführt, aber Sie sollten zumindest davon bewusst sein ... –