Was ist der Unterschied zwischen C # -Delegaten, Dynamic Proxy, Closures und Funktionszeigern?

8

Was sind nützliche Definitionen für die üblichen Methoden zum Übergeben einer Methode oder Funktion als Daten, wie zum Beispiel:

  • Delegierte
  • Verschlüsse
  • Funktionszeiger
  • Aufruf durch dynamischen Proxy und
  • Erstklassige Methoden?
Matthew Murdoch 04.06.2009, 17:18
quelle

3 Antworten

13
Mit

Funktionszeigern können Sie Funktionen wie Variablen übergeben. Funktionszeiger ist im Grunde eine Legacy-Methode, um Funktionen in Sprachen zu übergeben, die keine erstklassigen Methoden wie C / C ++ unterstützen.

Erstklassige Methoden Grundsätzlich können Sie Funktionen wie Variablen übergeben. Methoden (lose) bedeuten Funktionen. Das bedeutet im Grunde erstklassige Funktionen . Im einfachsten Sinne bedeutet dies, dass Funktionen als "First-Class-Bürger" behandelt werden, wie Variablen. In den alten Tagen (C / C ++), weil wir eine Funktion nicht direkt weitergeben können und wir auf Workarounds wie Funktionszeiger zurückgreifen mussten, sagten wir, dass Funktionen keine erstklassigen Bürger seien.

Delegates ist C #'s Antwort auf erstklassige Methoden. Delegierte sind etwas leistungsfähiger, weil es closures beinhaltet, betrachten Sie das folgende Code-Snippet:

%Vor%

Beachten Sie, dass bar auf die lokale Variable a verweisen kann, da Delegierte Closures verwenden können.

Closures kann auf den ersten Blick sehr verwirrend sein. Aber die Definition des faulen Mannes kann wirklich einfach sein. Es bedeutet im Grunde, dass eine Variable in der vom Menschen erwarteten Weise verfügbar sein kann. Mit anderen Worten, eine Variable kann an Stellen referenziert werden, wo sie aussehen, als wären sie vorhanden, indem sie die Struktur des Quellcodes lesen. Betrachten wir zum Beispiel das obige Codefragment. Wenn wir keine Schließung hätten, wäre bar nicht in der Lage, a zu referenzieren, weil a nur lokal für foo war, aber nicht bar , was eine andere Funktion ist.

Dynamischer Proxy ist die Ausnahme. Es gehört nicht zu diesen Artikeln. Erklären erfordert es einige sehr lange Texte. Es stammt aus dem berühmten Proxy-Muster . Das Problem mit Proxy Pattern war, dass die Proxy-Klasse die gleiche Schnittstelle wie der Subject implementieren muss. Dynamischer Proxy bedeutet im Grunde genommen, dass die Methode des Subjekts mithilfe eines reflektiven Ansatzes entdeckt wird, so dass das ProxyPattern von der Bindung an die Schnittstelle des Subjekts befreit werden kann.

    
kizzx2 06.06.2009, 20:24
quelle
0

nur diejenigen, die ich kenne:

  • Funktionszeiger: genau das, ein Zeiger auf ein Stück Code. Sie springen zu ihm, es führt aus. typisierte Sprachen können einige Parameterübergabekonventionen (d. h. C-Deklarationen)
  • erzwingen
  • Closures: Eine Funktion mit einigen gepaarten Zustand. am natürlichsten in lexikalisch beschränkten Sprachen geschrieben (d. h. Scheme, JavaScript, Lua). Mehrere Closures können den gleichen Status (oder einen Teil davon) teilen, was es zu einer einfachen Möglichkeit macht, OOP zu implementieren.
  • Erstklassige Methoden: eine aus einer Objektinstanz und einer Methode erzeugte Schließung. Einige Sprachen mit Closures und einem nativen OOP (Python, JavaScript) können automatisch Closures erstellen.
Javier 04.06.2009 17:55
quelle
0

Closure ist ein Programmiersprachenkonzept. Delegate ist seine Umsetzung in MS.NET.

Ein Delegat in MS.NET ist ein stark typisierter Zeiger auf die Methode eines Objekts (eine Delegat-Instanz zeigt auf beides - ein Objekt und seine Methode). Es gibt auch eine Möglichkeit, mehrere Voicedelegate-Instanzen zu einer zu kombinieren.

    
agsamek 05.06.2009 13:42
quelle