2014-01-21 7 views
8

Betrachten wir eine Klasse mit Ereignis haben erklärt:Warum kann öffentliches Ereignis nicht direkt außerhalb aufgerufen werden?

public class FooBar 
{ 
    public event EventHandler FooBarEvent; 
} 

Trotz „Öffentlichkeit“ der Veranstaltung, wir nicht FooBarEvent.Invoke von außen anrufen können.

Dies wird durch Modyfing eine Klasse mit dem folgenden Ansatz überwunden:

public class FooBar 
{ 
    public event EventHandler FooBarEvent; 

    public void RaiseFooBarEvent(object sender, EventArgs eventArguments) 
    { 
     FooBarEvent.Invoke(sender, eventArguments); 
    } 
} 

Warum außerhalb öffentlichen Veranstaltungen den Zugriff nur durch Hinzufügen und Entfernen von Hörern begrenzt ist?

+0

+1, gute Frage, wenn man bedenkt, dass das [Beobachtermuster] (http://en.wikipedia.org/wiki/Observer_pattern) * eine öffentliche "notifyObserver" -Methode hat. – Heinzi

Antwort

5

Das Definieren eines public -Ereignisses gibt Verbrauchern lediglich die Möglichkeit, sie zu abonnieren und abzubestellen. Die Möglichkeit, das Ereignis auszulösen, ist auf die Typhierarchie beschränkt, die das Ereignis deklariert.

Es wäre ein bisschen chaotisch, allen Teilnehmern zu erlauben, das Ereignis zu erhöhen. Stellen Sie sich zum Beispiel vor, ich hätte eine TextBox Klasse, die ein Focused Ereignis hatte. Wenn ein alter Verbraucher das Ereignis auslösen könnte, könnte das Ereignis Focused leicht ausgelöst werden, wenn die Klasse TextBox nicht wirklich fokussiert war. Dies würde es nahezu unmöglich machen, irgendeine Art von Invariante während eines Ereignisses aufrechtzuerhalten.

+2

'... ein bisschen chaotisch ...' Untertreibung des Monats :) – Alex

1

Ich denke, Sie sollten Ihre Perspektive ändern, wie Ereignisse funktionieren. Andere Klassen sollten das Ereignis nicht "besitzen" und es auslösen. Klassen, die auf das Ereignis "hören", indem sie es "abonnieren" und eine bestimmte Aktion ausführen, wenn dieses Ereignis eintritt.

2

Dafür gibt es Veranstaltungen. Wenn Sie es aufrufen möchten öffentlich müssen Sie wahrscheinlich delegates nicht events

Events Verkapselung gibt,

  1. Es andere Klassen verhindert nichts, um es von Zuordnung
  2. Es verhindert es als Parameter an Methoden vorbei
  3. Es verhindert die Zuweisung zu einer Variablen
  4. Es verhindert den Aufruf von anderen Klassen (nicht einmal abgeleitete Klassen haben Zugriff darauf)
  5. etc

public Zugänglichkeit erzählt, dass sie von überall gezeichnet werden können, nicht aufgerufen von überall.

3

Persönlich denke ich, dass dies getan wird, um die Designprinzipien hinter der gesamten Event-Architektur richtig zu vermitteln.

Der Zweck eines Ereignisses besteht darin, einen Listener über das Ereignis zu informieren, das in einem bestimmten Objekt auftritt.

Was bringt es, Ereignisse von Klassen zu erzeugen, die Ihnen nicht gehören?

0

So ist die Sprache definiert - ein Ereignis kann nur von der besitzenden Klasse ausgelöst werden. Wenn Sie es von einer anderen Klasse feuern muss, haben die besitzende Klasse eine öffentliche Methode definieren, die das Ereignis ausgelöst wird:

public FireFooBarEvent (object sender, EventArgs args) 
{ 
    if(FooBarEvent != null) 
     FooBarEvent(sender, args); 
} 

Und diese Methode aus jeder Klasse aufrufen.

1

die answer auf Ihre Frage ist

Ein Ereignis in C# eine Möglichkeit für eine Klasse-Benachrichtigungen an Kunden dieser Klasse zur Verfügung zu stellen ist, wenn einige interessante Sache zu einem Objekt geschieht.

Das Ereignis von außen aufrufen ist nicht sinnvoll, daher ist es nicht erlaubt.