2010-05-07 9 views

risposta

45

È possibile creare eventi statici. Li usi allo stesso modo di un evento normale, tranne che è usato in un contesto statico all'interno della classe.

public class MyClass 
{ 
    public static event EventHandler MyEvent; 

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

Detto questo, ci sono molti problemi con eventi statici. È necessario prestare particolare attenzione per annullare l'iscrizione degli oggetti da eventi statici, poiché una sottoscrizione a un evento statico radicherà l'istanza di sottoscrizione e impedirà al garbage collector di raccoglierla.

Inoltre, ho scoperto che nella maggior parte dei casi in cui vorrei creare eventi statici, tendo a imparare a utilizzare un evento standard su un Singleton. Questo gestisce gli stessi scenari di un evento statico, ma è (IMO) più ovvio che ti stai iscrivendo a un'istanza di livello "globale".

8

Sì, è possibile. Vedi, ad esempio, Application.ApplicationExit. Notare, tuttavia, gli avvertimenti su quella pagina in merito a perdite di memoria durante il collegamento a eventi statici; questo vale per tutti gli eventi statici.

Non c'è nulla di magico quando li si utilizza: quando è necessario fornire un evento per una classe statica o un evento che si occupa esclusivamente di dati statici e ha senso implementarlo in questo modo.

1

Sì, è possibile dichiarare un evento come statico. Li usi nello stesso modo in cui li useresti se fossero eventi di istanza, ma accedi al nome dell'evento in modo statico (ad esempio ClassName.EventName, anziché variableName.EventName).

Ora ... hai vuoi eventi statici? Questo è altamente discutibile. Personalmente direi di no, dal momento che qualsiasi cosa statica crea difficoltà nei test e dovrebbe quindi essere evitata quando possibile.

Ma è certamente possibile.

0
public delegate void SomeEventDelegate(); 

public class SomeClass 
{ 
     public static event SomeEventDelegate SomeEvent; 
} 
Problemi correlati