2010-05-07 5 views

Antwort

45

Sie können statische Ereignisse erstellen. Sie verwenden sie genauso wie ein normales Ereignis, außer dass es in einem statischen Kontext innerhalb der Klasse verwendet wird.

public class MyClass 
{ 
    public static event EventHandler MyEvent; 

    private static void RaiseEvent() 
    { 
     var handler = MyEvent; 
     if (handler != null) 
      handler(typeof(MyClass), EventArgs.Empty); 
    } 
} 

Das gesagt, es gibt viele Probleme mit statischen Ereignissen. Sie müssen besondere Sorgfalt walten lassen, um Ihre Objekte von statischen Ereignissen abzumelden, da eine Subskription für ein statisches Ereignis die Subskriptionsinstanz rootet und verhindert, dass der Garbage Collector sie jemals sammelt.

Auch habe ich gefunden, dass die meisten Fälle, in denen ich statische Ereignisse machen möchte, ich dazu neige, stattdessen ein Standardereignis auf einem Singleton zu verwenden. Dies behandelt die gleichen Szenarien wie ein statisches Ereignis, aber es ist (IMO) offensichtlicher, dass Sie eine "globale" Ebeneninstanz abonnieren.

8

Ja, Sie können. Siehe beispielsweise Application.ApplicationExit. Beachten Sie jedoch die Warnungen auf dieser Seite über Speicherverluste beim Anhängen an statische Ereignisse. das gilt für alle statischen Ereignisse.

Es gibt nichts Magisches daran, wenn Sie sie verwenden: Wenn Sie ein Ereignis für eine statische Klasse oder ein Ereignis bereitstellen müssen, das sich ausschließlich mit statischen Daten befasst, ist es sinnvoll, es auf diese Weise zu implementieren.

1

Ja, Sie können ein Ereignis als statisch deklarieren. Sie verwenden sie genauso, wie Sie sie verwenden würden, wenn sie Instanzereignisse wären, aber Sie greifen auf den Ereignisnamen in einer statischen Weise zu (d. H. ClassName.EventName, statt variableName.EventName).

Jetzt ... tun Sie möchten statische Ereignisse? Das ist sehr umstritten. Ich persönlich würde nein sagen, da Statik Schwierigkeiten beim Testen schafft und daher möglichst vermieden werden sollte.

Aber es ist sicherlich möglich.

0
public delegate void SomeEventDelegate(); 

public class SomeClass 
{ 
     public static event SomeEventDelegate SomeEvent; 
} 
Verwandte Themen