Vergleichstabelle
Vergleichsgrundlage | Delegierte | Veranstaltungen |
---|---|---|
Basic | Ein Delegat enthält die Referenz einer Methode. | Das Ereignis ist eine überlagerte Abstraktion, die den Delegierten zur Verfügung gestellt wird. |
Syntax | Delegate Rückgabewert Delegatname (Parameterliste); | event event_delegate event_name; |
Stichwort | Ein Delegat wird mit dem Schlüsselwort "Delegat" deklariert. | Ein Ereignis wird mit einem Schlüsselwort "Ereignis" deklariert. |
Erklärung | Ein Delegat wird außerhalb einer Klasse deklariert. | Ein Ereignis wird innerhalb einer Klasse deklariert. |
Aufrufen | Um eine Methode aufzurufen, muss sie an den Delegierten verwiesen werden. | Um eine Methode aufzurufen, muss sie dem Ereignis zugewiesen werden. |
Kovarianz und Widersprüchlichkeit | Sie bieten den Delegierten Flexibilität. | Kein solches Konzept. |
Event Accessor | Kein solches Konzept. | Verwaltet die Liste der Ereignishandler. |
Abhängigkeit | Delegierte sind unabhängig von Veranstaltungen. | Das Ereignis kann nicht ohne Delegierte erstellt werden. |
Definition der Delegierten
In C # werden Delegate als Funktionszeiger verwendet, um auf eine Methode zu verweisen. Es handelt sich dabei insbesondere um ein Objekt, das auf eine ihm zugewiesene Methode verweist. Derselbe Delegat kann verwendet werden, um auf verschiedene Methoden zu verweisen, da er in der Lage ist, den Verweis auf verschiedene Methoden zu halten, jedoch eine nach der anderen. Welche Methode vom Delegaten aufgerufen wird, wird zur Laufzeit festgelegt. Die Syntax für die Deklaration eines Delegaten lautet wie folgt:
Delegate Rückgabewert Delegatname (Parameterliste);
Hier gibt der return_type den Wertetyp an, der von der Methode zurückgegeben wird, die vom Delegaten aufgerufen wird, und Delegatenname ist der Name des Delegaten. Die Parameterliste definiert die Liste der Parameter, die von den Methoden benötigt werden, die vom Delegaten aufgerufen werden.
In Bezug auf die Delegierten sind einige wichtige Punkte zu beachten. Sie kann jede Methode aufrufen, die ihrer Signatur und dem Rückgabetyp entspricht. Ein Delegat kann sowohl eine Instanzmethode als auch eine statische Methode aufrufen. Wenn eine Instanzmethode aufgerufen wird, muss die Methode mithilfe von object aufgerufen werden. Delegaten unterstützen Multicasting, dh Sie können die Methoden zusammenfassen, die automatisch aufgerufen werden, wenn der auf sie verweisende Delegat aufgerufen wird. Sie müssen lediglich ein Delegate-Objekt erstellen und die Methoden der Kette mit dem Operator "+ =" nacheinander zuweisen. Sie können eine Methode auch mit dem Operator "- =" aufheben.
Die Funktionen, die dem Delegierten zusätzliche Flexibilität verleihen, sind Kovarianz und Kontravarianz. Kovarianz und Contravariance erlauben die Bedingung, dass der Rückgabetyp und die Signatur der dem Delegierten zugewiesenen Methode sich von der des Delegierten unterscheiden.
- Mit Kovarianz können Sie dem Delegaten eine Methode zuweisen, wobei der Rückgabetyp der Methode eine Klasse ist, die von der Klasse abgeleitet ist, die den Rückgabetyp des Delegaten angibt.
- Contravariance ermöglicht es Ihnen, dem Delegaten eine Methode zuzuweisen, wobei der Parametertyp der Methode eine Basisklasse der Klasse ist, die als Parameter des Delegaten angegeben ist.
Definition von Ereignissen
Ereignisse sind die ausgeführte Aktion, die den Status eines Objekts ändert. Ereignisse werden mit Delegaten deklariert. Ohne Delegaten können Sie keine Ereignisse deklarieren. Sie können sagen, dass ein Ereignis den Delegierten eine Kapselung bietet. Beim Umgang mit Ereignissen, die Ereignis- und Ereignisbehandlungsroutinen sind, gibt es zwei wichtige Verbindungen. Wenn die Objekte an dem Ereignis interessiert sind, registriert es einen Ereignishandler für dieses bestimmte Ereignis. Wenn die Ereignisse ausgelöst werden, werden die registrierten Ereignishandler aufgerufen. Die Deklaration der Veranstaltung lautet wie folgt:
event event_delegate event_name;
Hier ist "Ereignis" ein Schlüsselwort, das die Deklaration eines Ereignisses zeigt. Als Nächstes zeigt event_delegate den Namen des Delegaten an, der das Ereignis unterstützt. Dann ist event_name der Name des Ereignisses
Beim Umgang mit den Ereignissen sind einige wichtige Punkte zu beachten. Ereignisse können ebenso wie Delegaten Multicast sein, dh mehrere Objekte, die an einen Event-Handler angekettet (registriert) werden, reagieren, wenn ein Event ausgelöst wird. Die Event-Handler können mit dem Operator "+ =" zur Kette hinzugefügt und mit dem Operator "- =" entkettet werden. Sowohl die statische als auch die Instanzmethode können als Event-Handler verwendet werden. Mit dem Ereignis-Accessor können Sie die Implementierung der Event-Handler-Liste steuern.
Die Schnittstelle kann Ereignisse enthalten. Events können auch abstrakt sein, während accessor-basierte Events nicht abstrakt sein können. Das Ereignis kann virtuell sein und von abgeleiteten Klassen überschrieben werden.
Hauptunterschiede zwischen Delegierten und Ereignissen in C #
- Delegate ist ein Objekt, das als Funktionszeiger für die Referenz einer Methode verwendet wird. Auf der anderen Seite bieten Ereignisse eine Abstraktion für Delegierte.
- Ein zum Deklarieren eines Delegaten erforderliches Schlüsselwort ist ein Delegat, während ein zum Deklarieren eines Ereignisses erforderliches Schlüsselwort event ist.
- Ein Delegat wird außerhalb einer Klasse deklariert, während ein Ereignis innerhalb einer Klasse deklariert wird.
- Um eine Methode mit einem Delegate-Objekt aufzurufen, muss die Methode auf das Delegate-Objekt verwiesen werden. Um eine Methode unter Verwendung eines Ereignisobjekts aufzurufen, muss die Methode dagegen auf das Ereignisobjekt verwiesen werden.
- Kovarianz und Kontravarianz verleihen den Delegiertenobjekten zusätzliche Flexibilität. Auf der anderen Seite hat die Veranstaltung keine derartigen Konzepte.
- Event Accessor behandelt die Liste der Event-Handler, während der Delegat kein solches Konzept hat.
- Delegaten sind unabhängig von Ereignissen, aber Ereignisse können nicht ohne Delegat erstellt werden.
Fazit:
Delegaten sind nützlich, da sie Ereignisse unterstützen, und sie bieten die Möglichkeit, die Methode zur Laufzeit auszuführen. Mit dem Ereignis-Accessor können wir die Ereignishandler in Multithreading-Anwendungen synchronisieren.