Einführung in Delegaten und Ereignisse in C#

Delegaten bieten einen Mechanismus mit später Bindung in .NET. Späte Bindung bedeutet, dass Sie einen Algorithmus erstellen, in dem der Aufrufer auch mindestens eine Methode bereitstellt, die einen Teil des Algorithmus implementiert.

Sie können z.B. eine Liste von Sternen in einer Astronomie-Anwendung sortieren. Sie können diese Sterne nach ihrer Entfernung von der Erde, nach der Größe des Sterns oder ihrer wahrgenommenen Helligkeit sortieren.

In all diesen Fällen macht die Sort()-Methode im Prinzip das Gleiche: Sie ordnet die Elemente in der Liste basierend auf einen Vergleich. Der Code, der zwei Sterne vergleicht, ist bei jeder Sortierreihenfolge unterschiedlich.

Diese Arten von Lösungen wurden in der Softwareentwicklung für ein halbes Jahrhundert verwendet. Das Delegatenkonzept von C# bietet erstklassige Sprachunterstützung und Typsicherheit rund um das Konzept.

Wie Sie später in dieser Serie sehen werden, ist der C#-Code, den Sie für Algorithmen wie diesen schreiben, typsicher. Der Compiler stellt sicher, dass die Typen mit den Argumenten und Rückgabetypen übereinstimmen.

Funktionszeiger unterstützen ähnliche Szenarios, in denen Sie mehr Kontrolle über die Aufrufkonvention benötigen. Der einem Delegaten zugeordnete Code wird mithilfe einer virtuellen Methode aufgerufen, die einem Delegattypen hinzugefügt wird. Mithilfe von Funktionszeigern können Sie unterschiedliche Konventionen angeben.

Sprachliche Entwurfsziele für Delegaten

Die Sprachentwickler haben mehrere Ziele für die Funktion aufgezählt, die schließlich Delegaten geworden sind.

Das Team wollte ein allgemeines Sprachkonstrukt entwerfen, das für alle Algorithmen mit später Bindung verwendet werden kann. Mit Delegaten können Softwareentwickler ein Konzept erlernen und dasselbe Konzept bei vielen verschiedenen Softwareproblemen anwenden.

Außerdem sollten sowohl einzelne als auch Multicast-Methodenaufrufe unterstützt werden. (Multicastdelegaten sind Delegaten, die mehrere Methodenaufrufe verketten. Beispiele werden später in dieser Reihe gezeigt.)

Delegaten sollten dieselbe Typsicherheit unterstützen, die Entwickler von allen C#-Konstrukten erwarten.

Das Team hat schließlich erkannt, dass ein Ereignismuster ein bestimmtes Muster ist, für das Delegaten – bzw. beliebige Algorithmen mit später Bindung – sehr nützlich sind. Daher sollte sichergestellt werden, dass der Code für den Delegaten die Basis für das .NET-Ereignismuster bereitstellen konnte.

Das Ergebnis dieser Arbeit war die Delegat- und Ereignisunterstützung in C# und .NET.

Die restlichen Artikel in dieser Serie behandeln die Sprachfunktionen, die Bibliotheksunterstützung und allgemeine Ausdrücke, die bei der Arbeit mit Delegaten und Ereignissen verwendet werden. Behandelte Themen:

  • Das Schlüsselwort delegate und der damit generierte Code
  • Die Funktionen der System.Delegate-Klasse und die Verwendung dieser Funktionen
  • Erstellen typsicherer Delegaten
  • Erstellen von Methoden, die über Delegaten aufgerufen werden können
  • Verwenden von Lambdaausdrücken mit Delegaten und Ereignissen
  • Verwenden von Delegaten als Bausteine für LINQ
  • Delegaten als Grundlage für das .NET-Ereignismuster und ihre Unterschiede

Fangen wir also an.

Nächste