Stellen Sie sich vor, wir haben eine Klasse mit Ereignis deklariert:
%Vor% Trotz der "Öffentlichkeit" des Ereignisses können wir FooBarEvent.Invoke
nicht von außen aufrufen.
Dies wird überwunden, indem eine Klasse mit dem folgenden Ansatz verbessert wird:
%Vor%Warum ist der Zugriff auf öffentliche Ereignisse außerhalb nur durch das Hinzufügen und Entfernen von Listenern möglich?
Durch die Definition eines public
-Ereignisses können Verbraucher nur Abonnenten abonnieren und abmelden. Die Möglichkeit, das Ereignis auszulösen, ist auf die Typhierarchie beschränkt, die das Ereignis deklariert.
Es wäre ein bisschen chaotisch, allen Abonnenten zu erlauben, das Ereignis auch zu erhöhen. Stellen Sie sich zum Beispiel vor, ich hätte eine Klasse TextBox
mit einem Focused
-Ereignis. 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 ist. Dies würde es nahezu unmöglich machen, irgendeine Art von Invariante während eines Ereignisses aufrechtzuerhalten.
Persönlich denke ich, dass dies getan wird, um die Designprinzipien, die hinter der gesamten Veranstaltungsarchitektur stehen, 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 auszulösen, die Ihnen nicht gehören?
Dafür gibt es Veranstaltungen. Wenn Sie es öffentlich aufrufen möchten, benötigen Sie wahrscheinlich delegates
nicht events
Events gibt Verkapselung,
public
accessibility gibt an, dass es von überall und nicht von aufgerufen werden kann.
Ich denke, du solltest deine 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.
Die Antwort auf Ihre Frage ist
Ein Ereignis in C # ist eine Möglichkeit für eine Klasse, an Clients dieser Klasse Benachrichtigungen zu senden, wenn einem Objekt etwas Interessantes passiert.
Das Ereignis von außen aufzurufen ist nicht sinnvoll, daher ist es nicht erlaubt.
So ist die Sprache definiert - ein Ereignis kann nur von der besitzenden Klasse ausgelöst werden. Wenn Sie es aus einer anderen Klasse auslösen müssen, muss die besitzende Klasse eine öffentliche Methode definieren, die das Ereignis auslöst:
%Vor%Und rufe diese Methode von jeder Klasse auf.
Tags und Links c# event-handling delegates encapsulation