Antworten:
Ein Delegat ist ein benannter Typ, der eine bestimmte Art von Methode definiert. So wie eine Klassendefinition alle Mitglieder für die angegebene Art von Objekt festlegt, legt der Delegat die Methodensignatur für die Art der von ihm definierten Methode fest.
Basierend auf dieser Anweisung ist ein Delegat ein Funktionszeiger und definiert, wie diese Funktion aussieht.
Ein gutes Beispiel für eine reale Anwendung eines Delegaten ist das Prädikat . Im Beispiel des Links werden Sie feststellen, dass Array.Find das Array zur Suche und dann ein Prädikat verwendet, um die Kriterien für die Suche zu behandeln. In diesem Fall wird eine Methode ProductGT10 übergeben, die mit der Prädikatsignatur übereinstimmt.
Wie in "Lernen von C # 3.0: Beherrschen der Grundlagen von C # 3.0" angegeben
Allgemeines Szenario: Wenn ein Staatsoberhaupt stirbt, hat der Präsident der Vereinigten Staaten normalerweise keine Zeit, persönlich an der Beerdigung teilzunehmen. Stattdessen entsendet er einen Delegierten. Oft ist dieser Delegierte der Vizepräsident, aber manchmal ist der Vizepräsident nicht verfügbar und der Präsident muss eine andere Person entsenden, beispielsweise den Außenminister oder sogar die First Lady. Er möchte seine delegierte Autorität nicht an eine einzelne Person „fest verdrahten“. Er könnte diese Verantwortung an jeden delegieren, der in der Lage ist, das richtige internationale Protokoll auszuführen.
Der Präsident legt im Voraus fest, welche Verantwortung delegiert wird (Teilnahme an der Beerdigung), welche Parameter übergeben werden (Beileid, freundliche Worte) und welchen Wert er zurückerhalten möchte (guter Wille). Anschließend weist er dieser delegierten Verantwortung zur „Laufzeit“ im Verlauf seiner Präsidentschaft eine bestimmte Person zu.
In der Programmierung Szenario: Sie sind häufig mit Situationen konfrontiert, in denen Sie eine bestimmte Aktion ausführen müssen, aber nicht im Voraus wissen, welche Methode oder sogar welches Objekt Sie zur Ausführung aufrufen möchten.
Zum Beispiel: Eine Schaltfläche weiß möglicherweise nicht, welches Objekt oder welche Objekte benachrichtigt werden müssen. Anstatt die Schaltfläche mit einem bestimmten Objekt zu verbinden, verbinden Sie die Schaltfläche mit einem Delegaten und lösen diesen Delegaten dann bei der Ausführung des Programms in eine bestimmte Methode auf.
Eine häufige Verwendung von Delegaten für generische Listen besteht darin, über Aktionsdelegierte (oder deren anonymes Äquivalent) eine einzeilige foreach-Operation zu erstellen:
myList.Foreach( i => i.DoSomething());
Ich finde den Prädikat-Delegaten auch sehr nützlich beim Suchen oder Bereinigen einer Liste:
myList.FindAll( i => i.Name == "Bob");
myList.RemoveAll( i => i.Name == "Bob");
Ich weiß, dass Sie gesagt haben, dass kein Code erforderlich ist, aber ich finde es einfacher, seine Nützlichkeit über Code auszudrücken. :) :)
Wenn Sie wissen möchten, wie das Delegate-Muster in realem Code verwendet wird, sind Sie unter Mac OS X genau richtig. Cocoa ist Apples bevorzugtes UI-Toolkit für die Programmierung unter Mac OS X und in Objective C codiert Entwickelt, sodass jede UI-Komponente eher durch Delegierung als durch Unterklassen oder andere Mittel erweitert werden soll.
Für weitere Informationen empfehle ich, hier zu lesen, was Apple über Delegierte zu sagen hat .
Ich hatte ein Projekt, das Win32 Python verwendete.
Aus verschiedenen Gründen verwendeten einige Module odbc.py, um auf die Datenbank zuzugreifen, und andere Module - pyodbc.py.
Es gab ein Problem, wenn eine Funktion von beiden Modultypen verwendet werden musste. Es wurde ein Verbindungsobjekt als Argument übergeben, aber dann musste es wissen, ob dbi.dbiDate oder datetime zur Darstellung von Zeiten verwendet werden sollte.
Dies lag daran, dass odbc.py als Werte in SQL-Anweisungen das Datum dbi.dbiDate erwartet, während pyodbc.py Datetime-Werte erwartet.
Eine weitere Komplikation bestand darin, dass mit den von odbc.py und pyodbc.py erstellten Verbindungsobjekten keine zusätzlichen Felder festgelegt werden konnten.
Meine Lösung bestand darin, die von odbc.odbc (...) und pyodbc.pyodbc (...) zurückgegebenen Verbindungsobjekte von einer Delegatenklasse zu verpacken, die die gewünschte Zeitrepräsentationsfunktion als Wert eines zusätzlichen Felds enthält und die delegiert Alle anderen Feldanforderungen an das ursprüngliche Verbindungsobjekt.
Ich hatte die gleiche Frage wie Sie und ging auf diese Seite, um eine Antwort zu erhalten.
Anscheinend habe ich es nicht besser verstanden, obwohl ich die Beispiele in diesem Thread durchgesehen habe.
Nachdem ich Folgendes gelesen hatte, fand ich eine großartige Verwendung für Delegierte: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx
Dies scheint für neue Benutzer offensichtlicher zu sein, da die Übergabe von Werten in Forms viel komplizierter ist als bei ASP.NET-Websites mit POST / GET (QueryString).
Grundsätzlich definieren Sie einen Delegaten, der "TextBox- Text " als Parameter verwendet.
// Form 1
// Class Property Definition
public delegate void delPassData(TextBox text);
// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
Form2 frm= new Form2();
delPassData del=new delPassData(frm.funData);
del(this.textBox1);
frm.Show();
}
// ZUSAMMENFASSUNG: Delegat definieren, neue Form2-Klasse instanziieren, dem Delegat die Funktion funData () zuweisen, Ihre Textbox an den Delegaten übergeben. Zeigen Sie das Formular.
// Form2
public void passData(TextBox txtForm1)
{
label1.Text = txtForm1.Text;
}
// ZUSAMMENFASSUNG: Nehmen Sie einfach TextBox txtForm1 als Parameter (wie in Ihrem Delegaten definiert) und weisen Sie dem Text von textBox Beschriftungstext zu.
Ich hoffe, dass dies die Verwendung für Delegierte erleichtert :) ..
Eine schnelle Google-Suche ergab dieses http://en.wikipedia.org/wiki/Delegation_pattern . Grundsätzlich delegieren Sie jedes Mal, wenn Sie ein Objekt verwenden, das seine Aufrufe an ein anderes Objekt weiterleitet.