Wie können öffentliche Methoden nur in der Klasse selbst und in der Klasse sichtbar gemacht werden, die das Objekt in C # besitzt?

8

Mein Kollege und ich sind darauf gestoßen, als wir die Aufrufliste eines Delegierten untersucht haben. Wenn Sie ein Ereignis in der Klasse X erstellen, können Sie innerhalb dieser Klasse auf die öffentlichen Methoden des Ereignisses zugreifen. Aber (und bitte ignorieren Sie Dinge wie, warum Sie öffentlichen Zugang zu Klassenmitgliedern haben, das ist nicht, was wir fragen!), Wenn wir eine Klasse Y haben, die X instanziiert, und auf das Ereignis innerhalb von X zugreift, kann es nicht Rufen Sie eine der öffentlichen Methoden wie GetInvocationList () des Ereignisses auf. Wir wollten wissen, wie das funktioniert. Hier ist ein Codebeispiel (lesen Sie die Kommentare, um zu sehen, was wir meinen):

%Vor%

Aus Neugierde, wie erreichen Sie das und warum gibt es dieses Feature?

Vielen Dank  Amit

    
user555265 04.01.2012, 12:34
quelle

4 Antworten

9

Das ist das Keyword event ; Es ist ein Modifikator, der andere Operationen als die Subskription für die besitzende Klasse einschränkt. Wenn Sie das Schlüsselwort event entfernen, erhalten Sie einen einfachen Delegaten, der Clients außerhalb der Klasse z. die Methode GetInvocationList() auf.

In einem Blogpost vergleichen sie den generierten IL-Code für einen einfachen Delegaten und ein Ereignis und es wird behandelt genauso. Das Schlüsselwort event ist ein Modifikator zur Kompilierungszeit, der den Zugriff auf die Methoden des Delegaten einschränkt. (Es ermöglicht auch die Verwendung in Schnittstellen). Alle Details sind im Blogpost.

    
Anders Abel 04.01.2012, 12:42
quelle
1

Ich habe einige Informationen dazu gefunden - der Zugriff darauf außerhalb der deklarierenden Klasse ist sehr eingeschränkt - unten ist von der MSDN-Site ( Tutorial Ereignisse ).

  

Das Aufrufen eines Ereignisses kann nur innerhalb der Klasse erfolgen, die das Ereignis deklariert hat. Verbindung zu einem Event von außerhalb der Klasse   das erklärte es, ein Ereignis sieht wie ein Feld aus, aber Zugriff darauf   Feld ist sehr eingeschränkt. Die einzigen Dinge, die gemacht werden können, sind:

     

Erstellen Sie einen neuen Delegaten für dieses Feld.

     

Entfernen Sie einen Delegaten aus einem (möglicherweise zusammengesetzten) Feld.

     

Dies geschieht mit den Operatoren + = und - =. Um mit dem Empfang des Ereignisses zu beginnen   Aufrufe, erstellt Client-Code zuerst einen Delegaten des Ereignistyps   Dies bezieht sich auf die Methode, die vom Ereignis aufgerufen werden soll. Dann   Er stellt den Delegierten auf alle anderen Delegierten dieses Ereignisses zusammen   könnte mit + = verbunden sein.

Weitere Informationen finden Sie unter dem Link.

    
Davos555 04.01.2012 12:45
quelle
0

afaik es ist nur bei der Verwendung von Events, wenn Sie das "Ereignis" in der Zeile entfernen, können Sie die Methode einfach verwenden

    
Volker Mauel 04.01.2012 12:41
quelle
0

Stellen Sie sich Delegierte getrennt von Ereignissen vor

hmmm ... Ich werde hier einen WAG nehmen.

Fügen Sie Ihre Delegatendeklaration außerhalb von Klassen in Ihren Namespace ein.

  • Erstellen Sie in Klasse X eine Instanz dieses Delegaten (das Ereignis nicht zu beachten) und registrieren Sie sich "Handler:" (Ich benutze diesen Begriff lose) wie gewünscht.

  • Erstellen Sie eine öffentliche Methode oder Eigenschaft, damit Klasse Y eine Referenz erhalten kann to) der Delegat, und daher ist es Aufrufliste.

  • Jetzt können Sie in Klasse Y alles machen, was Sie wollen. Sie können sogar ein "Spiegelung" -Ereignis in Klasse Y, wobei die Delegataufrufliste der Klasse X verwendet wird.

radarbob 04.01.2012 14:53
quelle

Tags und Links