Verwendung von Delegaten in C # (oder anderen Sprachen)

7

Ich habe mich immer gefragt, wie Delegierte nützlich sein können und warum sollen wir sie verwenden? Abgesehen davon, dass sie Typ-sicher sind und all diese Vorteile in der Visual Studio-Dokumentation haben, was sind die tatsächlichen Anwendungen von Delegierten?

Ich habe schon eins gefunden und es ist sehr zielgerichtet.

%Vor%

Aber das zeigt mir nicht genau die Vorteile der Verwendung von Delegaten und nicht eines bedingten "If ... {}", das das Argument analysiert und die Methode ausführt.

Weiß jemand, warum es besser ist, delegate hier zu verwenden als "if ... {}"? Haben Sie auch andere Beispiele, die die Nützlichkeit von Delegierten zeigen?

Danke!

    
Omar Abid 06.07.2009, 08:02
quelle

11 Antworten

5

Der häufigste alltägliche Gebrauch von Delegierten, den ich mir in C # vorstellen kann, wäre die Ereignisbehandlung. Wenn Sie in einem WinForm eine Schaltfläche haben und beim Klicken auf die Schaltfläche etwas ausführen möchten, wird am Ende eine Delegatfunktion registriert, die beim Klicken auf die Schaltfläche aufgerufen wird.

All dies geschieht automatisch hinter den Kulissen des von Visual Studio selbst erzeugten Codes, sodass Sie möglicherweise nicht sehen können, wo es passiert.

Ein praktischer Fall, der für Sie hilfreicher wäre, wäre, wenn Sie eine Bibliothek erstellen möchten, die Benutzer verwenden können, die Daten aus einem Internet-Feed liest und sie benachrichtigt, wenn der Feed aktualisiert wurde. Durch die Verwendung von Delegaten können Programmierer, die Ihre Bibliothek verwenden, ihren eigenen Code aufrufen, sobald der Feed aktualisiert wird.

    
scwagner 06.07.2009, 08:08
quelle
5

Delegierte sind eine hervorragende Möglichkeit, Funktionen in eine Methode zu integrieren. Sie helfen sehr bei Code Wiederverwendung aus diesem Grund.

Denken Sie darüber nach, sagen Sie, Sie haben eine Gruppe verwandter Methoden, die fast die gleiche Funktionalität haben, aber nur ein paar Zeilen Code haben. Sie könnten all die Dinge, die diese Methoden gemeinsam haben, in eine einzige Methode umgestalten, dann könnten Sie die spezialisierte Funktionalität über einen Delegaten einbringen.

Nehmen Sie zum Beispiel alle von LINQ verwendeten IEnumerable-Erweiterungsmethoden. Alle von ihnen definieren allgemeine Funktionen, müssen jedoch einen Delegaten übergeben, um festzulegen, wie die Rückgabedaten projiziert werden oder wie die Daten gefiltert, sortiert usw. werden.

    
Doctor Jones 06.07.2009 08:08
quelle
4

Lambda-Ausdrücke
Delegierte wurden meist in Verbindung mit Veranstaltungen eingesetzt. Aber dynamische Sprachen zeigten ihre viel breitere Verwendung. Aus diesem Grund wurden die Delegierten bis zu C # 3.0 zu wenig genutzt, als wir Lambda-Ausdrücke erhielten. Es ist sehr einfach, etwas mit Lambda-Ausdrücken zu tun (das eine Delegate-Methode generiert)

Stellen Sie sich vor, Sie haben eine IEnumerable von Strings. Sie können einfach einen Delegaten definieren (mit Lambda-Ausdruck oder auf andere Weise) und ihn anwenden, um ihn auf jedem Element auszuführen (z. B. das Überschneiden überflüssiger Leerzeichen). Und das ohne Schleifenanweisungen. Natürlich können Ihre Delegierten noch komplexere Aufgaben erledigen.

    
Robert Koritnik 06.07.2009 08:09
quelle
3
___ qstntxt ___

Ich habe mich immer gefragt, wie Delegierte nützlich sein können und warum sollen wir sie verwenden? Abgesehen davon, dass sie Typ-sicher sind und all diese Vorteile in der Visual Studio-Dokumentation haben, was sind die tatsächlichen Anwendungen von Delegierten?

Ich habe schon eins gefunden und es ist sehr zielgerichtet.

%Vor%

Aber das zeigt mir nicht genau die Vorteile der Verwendung von Delegaten und nicht eines bedingten "If ... {}", das das Argument analysiert und die Methode ausführt.

Weiß jemand, warum es besser ist, delegate hier zu verwenden als "if ... {}"? Haben Sie auch andere Beispiele, die die Nützlichkeit von Delegierten zeigen?

Danke!

    
___ answer1085909 ___

Delegierte sind eine hervorragende Möglichkeit, Funktionen in eine Methode zu integrieren. Sie helfen sehr bei Code Wiederverwendung aus diesem Grund.

Denken Sie darüber nach, sagen Sie, Sie haben eine Gruppe verwandter Methoden, die fast die gleiche Funktionalität haben, aber nur ein paar Zeilen Code haben. Sie könnten all die Dinge, die diese Methoden gemeinsam haben, in eine einzige Methode umgestalten, dann könnten Sie die spezialisierte Funktionalität über einen Delegaten einbringen.

Nehmen Sie zum Beispiel alle von LINQ verwendeten IEnumerable-Erweiterungsmethoden. Alle von ihnen definieren allgemeine Funktionen, müssen jedoch einen Delegaten übergeben, um festzulegen, wie die Rückgabedaten projiziert werden oder wie die Daten gefiltert, sortiert usw. werden.

    
___ answer1085917 ___

Lambda-Ausdrücke
Delegierte wurden meist in Verbindung mit Veranstaltungen eingesetzt. Aber dynamische Sprachen zeigten ihre viel breitere Verwendung. Aus diesem Grund wurden die Delegierten bis zu C # 3.0 zu wenig genutzt, als wir Lambda-Ausdrücke erhielten. Es ist sehr einfach, etwas mit Lambda-Ausdrücken zu tun (das eine Delegate-Methode generiert)

Stellen Sie sich vor, Sie haben eine IEnumerable von Strings. Sie können einfach einen Delegaten definieren (mit Lambda-Ausdruck oder auf andere Weise) und ihn anwenden, um ihn auf jedem Element auszuführen (z. B. das Überschneiden überflüssiger Leerzeichen). Und das ohne Schleifenanweisungen. Natürlich können Ihre Delegierten noch komplexere Aufgaben erledigen.

    
___ answer085944 ___

Ich werde versuchen, einige Beispiele aufzuführen, die über ein einfaches Wenn-sonst-Szenario hinausgehen:

  1. Rückruf wird implementiert. Sie analysieren beispielsweise ein XML-Dokument und möchten, dass eine bestimmte Funktion aufgerufen wird, wenn ein bestimmter Knoten gefunden wird. Sie können die Delegierten an die Funktionen übergeben.

  2. Implementierung des Strategieentwurfsmusters. Weisen Sie den Delegierten der erforderlichen Algorithmus- / Strategie-Implementierung zu.

  3. Anonyme Delegaten für den Fall, dass einige Funktionen in einem separaten Thread ausgeführt werden sollen (und diese Funktion hat nichts, was sie an das Hauptprogramm zurücksenden könnte).

  4. Ereignisabonnement wie von anderen vorgeschlagen.

___ answer1086087 ___

Hier ist ein Beispiel aus der realen Welt. Ich verwende oft Delegaten, wenn ich einen externen Anruf umschlage. Zum Beispiel haben wir einen alten App-Server (von dem ich wünschte, er würde einfach weggehen), mit dem wir über .Net Remoting verbunden sind. Ich rufe den App-Server in einem Delegaten von einer 'Safecall'-Funktion wie folgt auf:

%Vor%

Offensichtlich ist die Fehlerbehandlung ein bisschen besser, aber Sie bekommen die ungefähre Idee.

    
___ answer1086157 ___

Delegierte sind einfach .Nets Implementierung von First-Class-Funktionen und ermöglicht den Sprachen, die sie verwenden, Funktionen höherer Ordnung .

Der Hauptvorteil eines solchen Stils besteht darin, dass allgemeine Aspekte in eine Funktion abstrahiert werden können, die genau das tut, was sie tun muss (z. B. das Durchlaufen einer Datenstruktur) und eine andere Funktion (oder Funktionen) bereitstellt, die sie anfordert etwas zu tun, wie es weitergeht.

Die kanonischen Funktionsbeispiele sind map und fold , die durch die Bereitstellung einer anderen Operation geändert werden kann, um alle möglichen Dinge zu tun.

Wenn Sie eine Liste von Ts summieren wollen und eine Funktion hinzufügen wollen, die zwei T's braucht und sie dann addiert (über partielle Anwendung) wird %code% zur Summe. %code% würde das Produkt werden, %code% das Maximum. In all diesen Beispielen muss der Programmierer nicht darüber nachdenken, wie die Eingabedaten durchlaufen werden, er muss sich nicht darum kümmern, was zu tun ist, wenn die Eingabe leer ist.

Dies sind einfache Beispiele (obwohl sie in Kombination mit anderen überraschend leistungsfähig sein können), aber die Traversierung von Bäumen (eine komplexere Aufgabe) kann allesamt hinter einer Funktion %code% abstrahiert werden. Das Schreiben der Tree-Fold-Funktion kann schwierig sein, aber sobald es fertig ist, kann es weithin verwendet werden, ohne sich um Bugs kümmern zu müssen.

Dies ist in Konzept und Design dem Hinzufügen von foreach-Schleifenkonstrukten zu traditionellen imperativen Sprachen ähnlich, wobei die Idee darin liegt, dass Sie die Schleifensteuerung nicht selbst schreiben müssen (da sie die Wahrscheinlichkeit um einen Fehler erhöht, erhöht sich Ausführlichkeit, die dem, was Sie tun, zu jedem Eintrag im Wege steht, statt wie Sie jeden Eintrag erhalten.Höhere Ordnungsfunktionen erlauben es Ihnen einfach, das Traversieren einer Struktur von dem zu trennen, was während des Durchlaufens zu tun ist < stark> erweiterbar innerhalb der Sprache selbst.

Es sollte beachtet werden, dass Delegaten in c # durch lambdas weitgehend ersetzt wurden, weil der Compiler sie einfach als weniger verbindlichen Delegaten behandeln kann, aber auch frei ist, den Ausdruck das Lambda zu übergeben stellt die Funktion dar, an die es übergeben wird, um eine (oft komplexe) Umstrukturierung oder Neuausrichtung des Wunschs in eine andere Domäne wie Datenbankabfragen über Linq-to-Sql zu ermöglichen.

Ein prinzipieller Vorteil des .net-Delegatmodells gegenüber c-style-Funktionszeigern besteht darin, dass es sich tatsächlich um ein Tupel (zwei Datenteile), die aufzurufende Funktion und das optionale Objekt handelt, auf dem die Funktion aufgerufen werden soll. Dadurch können Sie Funktionen mit Status übergeben, der noch leistungsfähiger ist. Da der Compiler dies verwenden kann, um Klassen hinter Ihrem Rücken zu konstruieren (1), instanziieren Sie eine neue Instanz dieser Klasse und platzieren Sie lokale Variablen, um Schließungen .

(1)

___ qstnhdr ___ Verwendung von Delegaten in C # (oder anderen Sprachen) ___ answer1085952 ___

In Ihrem Beispiel sind Ihre Vorteile die gleichen, also was Sie wirklich brauchen, ist ein Array von Strings.

Wenn Sie Delegaten im Befehlsmuster verwenden möchten, stellen Sie sich vor, Sie hätten:

%Vor%

Sie können eine Methode mit der gleichen Signatur, aber unterschiedlichen Aktionen ersetzen. Du hast ein zu einfaches Beispiel gewählt, mein Rat wäre - geh und finde ein Buch C # in Depth.

    
___ answer 1085922 ___

Delegierte werden verwendet, um Code in anderen Klassen (die nicht unbedingt in derselben Klasse, Klasse oder .cs oder sogar derselben Assembly liegen müssen) "aufzurufen".

In Ihrem Beispiel können Delegierte einfach durch if-Anweisungen ersetzt werden, wie Sie darauf hingewiesen haben.

Delegierte verweisen jedoch auf Funktionen, die irgendwo im Code "leben", wo Sie aus organisatorischen Gründen (leicht) keinen Zugriff haben.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ answer1085930 ___

Eine weitere nützliche Anwendung finde ich, wenn ich dieselbe Operation ausführen, dieselben Daten weitergeben oder dieselbe Aktion in mehreren Instanzen desselben Objekttyps auslösen möchte.

    
___ answer1086078 ___

Delegierte und verwandter syntaktischer Zucker haben die C # -Welt signifikant verändert (2.0+) Delegaten sind typsichere Funktionszeiger - also Sie verwenden Delegaten überall dort, wo Sie einen Codeblock zu einem späteren Zeitpunkt aufrufen / ausführen möchten .

Breite Abschnitte, die ich mir vorstellen kann

Callbacks / Event-Handler : Das passiert, wenn EventX passiert. Oder tun Sie dies, wenn Sie mit den Ergebnissen meines asynchronen Methodenaufrufs fertig sind.

%Vor%

LINQ : Auswahl, Projektion usw. von Elementen, an denen Sie etwas mit jedem Element ausführen möchten, bevor Sie es in der Pipeline übergeben. z.B. Wählen Sie alle geraden Zahlen aus und geben Sie dann das Quadrat der einzelnen Zahlen zurück.

%Vor%     
___ tag123delegates ___ Delegierte können sich auf mehrere Konzepte beziehen. Ein Objekt kann sich auf einen anderen (einen Delegaten) verlassen, um eine Funktion auszuführen. Die Delegierung kann sich auch auf das Programmiersprachenmerkmal beziehen, das die Methodensuchregeln zum Absetzen von Selbstanrufen verwendet. In C # definiert ein Delegat, welche Methode aufgerufen wird, wenn ein Ereignis ausgelöst wird. ___ answer1086001 ___

In .NET werden Stellvertreter auch benötigt, wenn die Benutzeroberfläche von einem Hintergrundthread aktualisiert wird. Da Sie die Steuerelemente nicht von einem Thread aktualisieren können, der sich von dem unterscheidet, mit dem die Steuerelemente erstellt wurden, müssen Sie den Aktualisierungscode mit dem Kontext des erzeugenden Threads aufrufen (meist mit this.Invoke).

    
___ answer1085914 ___

Der häufigste alltägliche Gebrauch von Delegierten, den ich mir in C # vorstellen kann, wäre die Ereignisbehandlung. Wenn Sie in einem WinForm eine Schaltfläche haben und beim Klicken auf die Schaltfläche etwas ausführen möchten, wird am Ende eine Delegatfunktion registriert, die beim Klicken auf die Schaltfläche aufgerufen wird.

All dies geschieht automatisch hinter den Kulissen des von Visual Studio selbst erzeugten Codes, sodass Sie möglicherweise nicht sehen können, wo es passiert.

Ein praktischer Fall, der für Sie hilfreicher wäre, wäre, wenn Sie eine Bibliothek erstellen möchten, die Benutzer verwenden können, die Daten aus einem Internet-Feed liest und sie benachrichtigt, wenn der Feed aktualisiert wurde. Durch die Verwendung von Delegaten können Programmierer, die Ihre Bibliothek verwenden, ihren eigenen Code aufrufen, sobald der Feed aktualisiert wird.

    
___
Sesh 06.07.2009 08:17
quelle
3

Delegierte sind einfach .Nets Implementierung von First-Class-Funktionen und ermöglicht den Sprachen, die sie verwenden, Funktionen höherer Ordnung .

Der Hauptvorteil eines solchen Stils besteht darin, dass allgemeine Aspekte in eine Funktion abstrahiert werden können, die genau das tut, was sie tun muss (z. B. das Durchlaufen einer Datenstruktur) und eine andere Funktion (oder Funktionen) bereitstellt, die sie anfordert etwas zu tun, wie es weitergeht.

Die kanonischen Funktionsbeispiele sind map und fold , die durch die Bereitstellung einer anderen Operation geändert werden kann, um alle möglichen Dinge zu tun.

Wenn Sie eine Liste von Ts summieren wollen und eine Funktion hinzufügen wollen, die zwei T's braucht und sie dann addiert (über partielle Anwendung) wird fold add 0 zur Summe. fold multiply 1 würde das Produkt werden, fold max 0 das Maximum. In all diesen Beispielen muss der Programmierer nicht darüber nachdenken, wie die Eingabedaten durchlaufen werden, er muss sich nicht darum kümmern, was zu tun ist, wenn die Eingabe leer ist.

Dies sind einfache Beispiele (obwohl sie in Kombination mit anderen überraschend leistungsfähig sein können), aber die Traversierung von Bäumen (eine komplexere Aufgabe) kann allesamt hinter einer Funktion treefold abstrahiert werden. Das Schreiben der Tree-Fold-Funktion kann schwierig sein, aber sobald es fertig ist, kann es weithin verwendet werden, ohne sich um Bugs kümmern zu müssen.

Dies ist in Konzept und Design dem Hinzufügen von foreach-Schleifenkonstrukten zu traditionellen imperativen Sprachen ähnlich, wobei die Idee darin liegt, dass Sie die Schleifensteuerung nicht selbst schreiben müssen (da sie die Wahrscheinlichkeit um einen Fehler erhöht, erhöht sich Ausführlichkeit, die dem, was Sie tun, zu jedem Eintrag im Wege steht, statt wie Sie jeden Eintrag erhalten.Höhere Ordnungsfunktionen erlauben es Ihnen einfach, das Traversieren einer Struktur von dem zu trennen, was während des Durchlaufens zu tun ist < stark> erweiterbar innerhalb der Sprache selbst.

Es sollte beachtet werden, dass Delegaten in c # durch lambdas weitgehend ersetzt wurden, weil der Compiler sie einfach als weniger verbindlichen Delegaten behandeln kann, aber auch frei ist, den Ausdruck das Lambda zu übergeben stellt die Funktion dar, an die es übergeben wird, um eine (oft komplexe) Umstrukturierung oder Neuausrichtung des Wunschs in eine andere Domäne wie Datenbankabfragen über Linq-to-Sql zu ermöglichen.

Ein prinzipieller Vorteil des .net-Delegatmodells gegenüber c-style-Funktionszeigern besteht darin, dass es sich tatsächlich um ein Tupel (zwei Datenteile), die aufzurufende Funktion und das optionale Objekt handelt, auf dem die Funktion aufgerufen werden soll. Dadurch können Sie Funktionen mit Status übergeben, der noch leistungsfähiger ist. Da der Compiler dies verwenden kann, um Klassen hinter Ihrem Rücken zu konstruieren (1), instanziieren Sie eine neue Instanz dieser Klasse und platzieren Sie lokale Variablen, um Schließungen .

(1)

ShuggyCoUk 06.07.2009 09:16
quelle
2

In Ihrem Beispiel sind Ihre Vorteile die gleichen, also was Sie wirklich brauchen, ist ein Array von Strings.

Wenn Sie Delegaten im Befehlsmuster verwenden möchten, stellen Sie sich vor, Sie hätten:

%Vor%

Sie können eine Methode mit der gleichen Signatur, aber unterschiedlichen Aktionen ersetzen. Du hast ein zu einfaches Beispiel gewählt, mein Rat wäre - geh und finde ein Buch C # in Depth.

    
Oleg Kalenbet 06.07.2009 08:19
quelle
2

Hier ist ein Beispiel aus der realen Welt. Ich verwende oft Delegaten, wenn ich einen externen Anruf umschlage. Zum Beispiel haben wir einen alten App-Server (von dem ich wünschte, er würde einfach weggehen), mit dem wir über .Net Remoting verbunden sind. Ich rufe den App-Server in einem Delegaten von einer 'Safecall'-Funktion wie folgt auf:

%Vor%

Offensichtlich ist die Fehlerbehandlung ein bisschen besser, aber Sie bekommen die ungefähre Idee.

    
Russell Troywest 06.07.2009 08:56
quelle
1
___ qstntxt ___

Ich habe mich immer gefragt, wie Delegierte nützlich sein können und warum sollen wir sie verwenden? Abgesehen davon, dass sie Typ-sicher sind und all diese Vorteile in der Visual Studio-Dokumentation haben, was sind die tatsächlichen Anwendungen von Delegierten?

Ich habe schon eins gefunden und es ist sehr zielgerichtet.

%Vor%

Aber das zeigt mir nicht genau die Vorteile der Verwendung von Delegaten und nicht eines bedingten "If ... {}", das das Argument analysiert und die Methode ausführt.

Weiß jemand, warum es besser ist, delegate hier zu verwenden als "if ... {}"? Haben Sie auch andere Beispiele, die die Nützlichkeit von Delegierten zeigen?

Danke!

    
___ answer1085909 ___

Delegierte sind eine hervorragende Möglichkeit, Funktionen in eine Methode zu integrieren. Sie helfen sehr bei Code Wiederverwendung aus diesem Grund.

Denken Sie darüber nach, sagen Sie, Sie haben eine Gruppe verwandter Methoden, die fast die gleiche Funktionalität haben, aber nur ein paar Zeilen Code haben. Sie könnten all die Dinge, die diese Methoden gemeinsam haben, in eine einzige Methode umgestalten, dann könnten Sie die spezialisierte Funktionalität über einen Delegaten einbringen.

Nehmen Sie zum Beispiel alle von LINQ verwendeten IEnumerable-Erweiterungsmethoden. Alle von ihnen definieren allgemeine Funktionen, müssen jedoch einen Delegaten übergeben, um festzulegen, wie die Rückgabedaten projiziert werden oder wie die Daten gefiltert, sortiert usw. werden.

    
___ answer1085917 ___

Lambda-Ausdrücke
Delegierte wurden meist in Verbindung mit Veranstaltungen eingesetzt. Aber dynamische Sprachen zeigten ihre viel breitere Verwendung. Aus diesem Grund wurden die Delegierten bis zu C # 3.0 zu wenig genutzt, als wir Lambda-Ausdrücke erhielten. Es ist sehr einfach, etwas mit Lambda-Ausdrücken zu tun (das eine Delegate-Methode generiert)

Stellen Sie sich vor, Sie haben eine IEnumerable von Strings. Sie können einfach einen Delegaten definieren (mit Lambda-Ausdruck oder auf andere Weise) und ihn anwenden, um ihn auf jedem Element auszuführen (z. B. das Überschneiden überflüssiger Leerzeichen). Und das ohne Schleifenanweisungen. Natürlich können Ihre Delegierten noch komplexere Aufgaben erledigen.

    
___ answer085944 ___

Ich werde versuchen, einige Beispiele aufzuführen, die über ein einfaches Wenn-sonst-Szenario hinausgehen:

  1. Rückruf wird implementiert. Sie analysieren beispielsweise ein XML-Dokument und möchten, dass eine bestimmte Funktion aufgerufen wird, wenn ein bestimmter Knoten gefunden wird. Sie können die Delegierten an die Funktionen übergeben.

  2. Implementierung des Strategieentwurfsmusters. Weisen Sie den Delegierten der erforderlichen Algorithmus- / Strategie-Implementierung zu.

  3. Anonyme Delegaten für den Fall, dass einige Funktionen in einem separaten Thread ausgeführt werden sollen (und diese Funktion hat nichts, was sie an das Hauptprogramm zurücksenden könnte).

  4. Ereignisabonnement wie von anderen vorgeschlagen.

___ answer1086087 ___

Hier ist ein Beispiel aus der realen Welt. Ich verwende oft Delegaten, wenn ich einen externen Anruf umschlage. Zum Beispiel haben wir einen alten App-Server (von dem ich wünschte, er würde einfach weggehen), mit dem wir über .Net Remoting verbunden sind. Ich rufe den App-Server in einem Delegaten von einer 'Safecall'-Funktion wie folgt auf:

%Vor%

Offensichtlich ist die Fehlerbehandlung ein bisschen besser, aber Sie bekommen die ungefähre Idee.

    
___ answer1086157 ___

Delegierte sind einfach .Nets Implementierung von First-Class-Funktionen und ermöglicht den Sprachen, die sie verwenden, Funktionen höherer Ordnung .

Der Hauptvorteil eines solchen Stils besteht darin, dass allgemeine Aspekte in eine Funktion abstrahiert werden können, die genau das tut, was sie tun muss (z. B. das Durchlaufen einer Datenstruktur) und eine andere Funktion (oder Funktionen) bereitstellt, die sie anfordert etwas zu tun, wie es weitergeht.

Die kanonischen Funktionsbeispiele sind map und fold , die durch die Bereitstellung einer anderen Operation geändert werden kann, um alle möglichen Dinge zu tun.

Wenn Sie eine Liste von Ts summieren wollen und eine Funktion hinzufügen wollen, die zwei T's braucht und sie dann addiert (über partielle Anwendung) wird %code% zur Summe. %code% würde das Produkt werden, %code% das Maximum. In all diesen Beispielen muss der Programmierer nicht darüber nachdenken, wie die Eingabedaten durchlaufen werden, er muss sich nicht darum kümmern, was zu tun ist, wenn die Eingabe leer ist.

Dies sind einfache Beispiele (obwohl sie in Kombination mit anderen überraschend leistungsfähig sein können), aber die Traversierung von Bäumen (eine komplexere Aufgabe) kann allesamt hinter einer Funktion %code% abstrahiert werden. Das Schreiben der Tree-Fold-Funktion kann schwierig sein, aber sobald es fertig ist, kann es weithin verwendet werden, ohne sich um Bugs kümmern zu müssen.

Dies ist in Konzept und Design dem Hinzufügen von foreach-Schleifenkonstrukten zu traditionellen imperativen Sprachen ähnlich, wobei die Idee darin liegt, dass Sie die Schleifensteuerung nicht selbst schreiben müssen (da sie die Wahrscheinlichkeit um einen Fehler erhöht, erhöht sich Ausführlichkeit, die dem, was Sie tun, zu jedem Eintrag im Wege steht, statt wie Sie jeden Eintrag erhalten.Höhere Ordnungsfunktionen erlauben es Ihnen einfach, das Traversieren einer Struktur von dem zu trennen, was während des Durchlaufens zu tun ist < stark> erweiterbar innerhalb der Sprache selbst.

Es sollte beachtet werden, dass Delegaten in c # durch lambdas weitgehend ersetzt wurden, weil der Compiler sie einfach als weniger verbindlichen Delegaten behandeln kann, aber auch frei ist, den Ausdruck das Lambda zu übergeben stellt die Funktion dar, an die es übergeben wird, um eine (oft komplexe) Umstrukturierung oder Neuausrichtung des Wunschs in eine andere Domäne wie Datenbankabfragen über Linq-to-Sql zu ermöglichen.

Ein prinzipieller Vorteil des .net-Delegatmodells gegenüber c-style-Funktionszeigern besteht darin, dass es sich tatsächlich um ein Tupel (zwei Datenteile), die aufzurufende Funktion und das optionale Objekt handelt, auf dem die Funktion aufgerufen werden soll. Dadurch können Sie Funktionen mit Status übergeben, der noch leistungsfähiger ist. Da der Compiler dies verwenden kann, um Klassen hinter Ihrem Rücken zu konstruieren (1), instanziieren Sie eine neue Instanz dieser Klasse und platzieren Sie lokale Variablen, um Schließungen .

(1)

___ qstnhdr ___ Verwendung von Delegaten in C # (oder anderen Sprachen) ___ answer1085952 ___

In Ihrem Beispiel sind Ihre Vorteile die gleichen, also was Sie wirklich brauchen, ist ein Array von Strings.

Wenn Sie Delegaten im Befehlsmuster verwenden möchten, stellen Sie sich vor, Sie hätten:

%Vor%

Sie können eine Methode mit der gleichen Signatur, aber unterschiedlichen Aktionen ersetzen. Du hast ein zu einfaches Beispiel gewählt, mein Rat wäre - geh und finde ein Buch C # in Depth.

    
___ answer 1085922 ___

Delegierte werden verwendet, um Code in anderen Klassen (die nicht unbedingt in derselben Klasse, Klasse oder .cs oder sogar derselben Assembly liegen müssen) "aufzurufen".

In Ihrem Beispiel können Delegierte einfach durch if-Anweisungen ersetzt werden, wie Sie darauf hingewiesen haben.

Delegierte verweisen jedoch auf Funktionen, die irgendwo im Code "leben", wo Sie aus organisatorischen Gründen (leicht) keinen Zugriff haben.

    
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123net ___ Das .NET-Framework ist ein Software-Framework, das hauptsächlich für das Microsoft Windows-Betriebssystem entwickelt wurde. Es enthält eine Implementierung der Basisklassenbibliothek, Common Language Runtime (allgemein als CLR bezeichnet), Common Type System (allgemein als CTS bezeichnet) und Dynamic Language Runtime. Es unterstützt viele Programmiersprachen, einschließlich C #, VB.NET, F # und C ++ / CLI. NICHT für Fragen zu .NET Core verwenden. ___ answer1085930 ___

Eine weitere nützliche Anwendung finde ich, wenn ich dieselbe Operation ausführen, dieselben Daten weitergeben oder dieselbe Aktion in mehreren Instanzen desselben Objekttyps auslösen möchte.

    
___ answer1086078 ___

Delegierte und verwandter syntaktischer Zucker haben die C # -Welt signifikant verändert (2.0+) Delegaten sind typsichere Funktionszeiger - also Sie verwenden Delegaten überall dort, wo Sie einen Codeblock zu einem späteren Zeitpunkt aufrufen / ausführen möchten .

Breite Abschnitte, die ich mir vorstellen kann

Callbacks / Event-Handler : Das passiert, wenn EventX passiert. Oder tun Sie dies, wenn Sie mit den Ergebnissen meines asynchronen Methodenaufrufs fertig sind.

%Vor%

LINQ : Auswahl, Projektion usw. von Elementen, an denen Sie etwas mit jedem Element ausführen möchten, bevor Sie es in der Pipeline übergeben. z.B. Wählen Sie alle geraden Zahlen aus und geben Sie dann das Quadrat der einzelnen Zahlen zurück.

%Vor%     
___ tag123delegates ___ Delegierte können sich auf mehrere Konzepte beziehen. Ein Objekt kann sich auf einen anderen (einen Delegaten) verlassen, um eine Funktion auszuführen. Die Delegierung kann sich auch auf das Programmiersprachenmerkmal beziehen, das die Methodensuchregeln zum Absetzen von Selbstanrufen verwendet. In C # definiert ein Delegat, welche Methode aufgerufen wird, wenn ein Ereignis ausgelöst wird. ___ answer1086001 ___

In .NET werden Stellvertreter auch benötigt, wenn die Benutzeroberfläche von einem Hintergrundthread aktualisiert wird. Da Sie die Steuerelemente nicht von einem Thread aktualisieren können, der sich von dem unterscheidet, mit dem die Steuerelemente erstellt wurden, müssen Sie den Aktualisierungscode mit dem Kontext des erzeugenden Threads aufrufen (meist mit this.Invoke).

    
___ answer1085914 ___

Der häufigste alltägliche Gebrauch von Delegierten, den ich mir in C # vorstellen kann, wäre die Ereignisbehandlung. Wenn Sie in einem WinForm eine Schaltfläche haben und beim Klicken auf die Schaltfläche etwas ausführen möchten, wird am Ende eine Delegatfunktion registriert, die beim Klicken auf die Schaltfläche aufgerufen wird.

All dies geschieht automatisch hinter den Kulissen des von Visual Studio selbst erzeugten Codes, sodass Sie möglicherweise nicht sehen können, wo es passiert.

Ein praktischer Fall, der für Sie hilfreicher wäre, wäre, wenn Sie eine Bibliothek erstellen möchten, die Benutzer verwenden können, die Daten aus einem Internet-Feed liest und sie benachrichtigt, wenn der Feed aktualisiert wurde. Durch die Verwendung von Delegaten können Programmierer, die Ihre Bibliothek verwenden, ihren eigenen Code aufrufen, sobald der Feed aktualisiert wird.

    
___
tzup 06.07.2009 08:11
quelle
1

Delegierte und verwandter syntaktischer Zucker haben die C # -Welt signifikant verändert (2.0+) Delegaten sind typsichere Funktionszeiger - also Sie verwenden Delegaten überall dort, wo Sie einen Codeblock zu einem späteren Zeitpunkt aufrufen / ausführen möchten .

Breite Abschnitte, die ich mir vorstellen kann

Callbacks / Event-Handler : Das passiert, wenn EventX passiert. Oder tun Sie dies, wenn Sie mit den Ergebnissen meines asynchronen Methodenaufrufs fertig sind.

%Vor%

LINQ : Auswahl, Projektion usw. von Elementen, an denen Sie etwas mit jedem Element ausführen möchten, bevor Sie es in der Pipeline übergeben. z.B. Wählen Sie alle geraden Zahlen aus und geben Sie dann das Quadrat der einzelnen Zahlen zurück.

%Vor%     
Gishu 06.07.2009 08:54
quelle
0

Eine weitere nützliche Anwendung finde ich, wenn ich dieselbe Operation ausführen, dieselben Daten weitergeben oder dieselbe Aktion in mehreren Instanzen desselben Objekttyps auslösen möchte.

    
ChrisBD 06.07.2009 08:13
quelle
0

In .NET werden Stellvertreter auch benötigt, wenn die Benutzeroberfläche von einem Hintergrundthread aktualisiert wird. Da Sie die Steuerelemente nicht von einem Thread aktualisieren können, der sich von dem unterscheidet, mit dem die Steuerelemente erstellt wurden, müssen Sie den Aktualisierungscode mit dem Kontext des erzeugenden Threads aufrufen (meist mit this.Invoke).

    
Thorsten Dittmar 06.07.2009 08:34
quelle

Tags und Links