Einführung in Stellvertretungen 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 Reihe sehen werden, ist der C#-Code, den Sie für Algorithmen schreiben, wie dies typsicher ist. Der Compiler stellt sicher, dass die Typen für Argumente und Rückgabetypen übereinstimmen.

Funktionszeiger wurden C# 9 für ähnliche Szenarios hinzugefügt, 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. (Multicast-Stellvertretungen sind Stellvertretungen, die mehrere Methodenaufrufe zusammenketten. Später in dieser Reihe werden Beispiele angezeigt.)

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

Schließlich hat das Team erkannt, dass ein Ereignismuster ein bestimmtes Muster ist, bei dem Stellvertretungen oder ein verspäteter Bindungsalgorithmus nützlich ist. 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 Reihe umfassen Sprachfeatures, Bibliotheksunterstützung und gängige Idiome, die beim Arbeiten mit Stellvertretungen und Ereignissen verwendet werden. Behandelte Themen:

  • Das delegate Schlüsselwort und den generierten Code.
  • Die Features in der System.Delegate Klasse und die Verwendung dieser Features.
  • So erstellen Sie typsichere Stellvertretungen.
  • So erstellen Sie Methoden, die über Stellvertretungen aufgerufen werden können.
  • Verwenden von Lambda-Ausdrücken zum Arbeiten mit Stellvertretungen und Ereignissen.
  • Wie Stellvertretungen zu einem der Bausteine für LINQ werden.
  • Wie Stellvertretungen die Basis für das .NET-Ereignismuster sind und wie sie unterschiedlich sind.

Fangen wir also an.

Nächste