Wichtig: Seien Sie sehr vorsichtig beim Abonnieren eines statischen Ereignisses von Instanzen. Statisch zu statisch ist in Ordnung, aber eine Subskription von einem statischen Ereignis zu einem Instanz-Handler ist eine großartige (lese: sehr gefährliche) Möglichkeit, diese Instanz für immer am Leben zu erhalten. GC wird den Link sehen und die Instanz nicht sammeln, wenn Sie sich nicht abmelden (oder etwas wie eine WeakReference verwenden).
Das Muster statische Ereignisse für die Erstellung ist die gleiche wie isntance Ereignisse, nur mit static
:
public static event EventHandler SomeEvent;
Um das Leben leichter (re null Kontrolle) zu machen, hier ein nützlicher Trick einen trivialen Handler hinzuzufügen ist:
public static event EventHandler SomeEvent = delegate {};
Dann können Sie einfach aufrufen, ohne das null-Check:
SomeEvent(null, EventArgs.Empty);
Beachten Sie, dass Delegationsinstanzen unveränderlich sind und die De-Referenzierung threadsicher ist. Daher gibt es hier niemals eine Racebedingung und es ist nicht erforderlich, zu sperren, wer immer abonniert ist, wenn die De-Referenz aufgerufen wird.
(passen Sie für Ihre eigenen Event-Args etc). Dieser Trick gilt gleichermaßen für Instanzereignisse.
Beim Lesen Ihrer Antwort haben Sie gesagt: "Eine Subskription von einem statischen Ereignis zu einem Instanz-Handler ist eine großartige Möglichkeit, diese Instanz für immer am Leben zu erhalten", nehme ich an, dass dies nicht immer optimal ist. Wenn ich zum Beispiel eine statische Klasse verwende, um die Formulareinstellungen während der Ausführung zu speichern, ist das nicht so schlimm, da es statisch ist und nicht mehrere Kopien haben kann. (Anfänger Programmierer, vergib die schlechte Terminologie) – Josh
@Josh der "große Weg" war gemeint als "eine wirklich gefährliche Art und Weise" - das habe ich geklärt. Wenn Sie nur ein Abonnement haben, ist dies kein großes Problem, unabhängig davon, ob es sich um eine statische vs -Instanz handelt. Der gefährliche Teil kommt, wenn jede Instanz (sagen wir) ein statisches Ereignis oder ein Ereignis auf einem langlebigen Objekt subskribiert und niemals abmeldet. Hey presto: Speicher verstopfen. –
"Abonnement von einem statischen Ereignis zu einem Instanz-Handler" ist es absichtlich so geschrieben? Ich glaube, dass es stattdessen "Subskription von einem Instanz-Handler ein statisches Ereignis" sein sollte. –