Warum kann ein öffentliches Ereignis nicht direkt außerhalb aufgerufen werden?

8

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?

    
Илья Терещук 21.01.2014, 12:50
quelle

6 Antworten

5

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.

    
JaredPar 21.01.2014, 12:56
quelle
3

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?

    
Alex 21.01.2014 12:54
quelle
2

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

Events gibt Verkapselung,

  1. Es verhindert, dass andere Klassen ihm etwas zuweisen
  2. Es verhindert die Übergabe als Parameter an Methoden
  3. Es verhindert die Zuweisung zu einer Variablen
  4. Es verhindert den Aufruf von anderen Klassen (nicht einmal abgeleitete Klassen haben Zugriff darauf)
  5. usw.

public accessibility gibt an, dass es von überall und nicht von aufgerufen werden kann.

    
Sriram Sakthivel 21.01.2014 12:54
quelle
1

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.

    
WoIIe 21.01.2014 12:53
quelle
1

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.

    
Ehsan 21.01.2014 13:04
quelle
0

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.

    
Uri Y 21.01.2014 12:56
quelle