Visual C# 2012 Grundkurs

Delegates

Testen Sie unsere 1958 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Ein Delegate ist ein Mechanismus, mit welchem Methoden als Parameter innerhalb eines Systems herumgereicht werden können.

Transkript

In diesen Abschnitt möchte ich zeigen, was Delegates sind. Sie werden Delegates in Ihrer täglichen Arbeit häufig brauchen. Es ist also ein sehr wichtiger Abschnitt. Ein Delegate ist ein Mechanismus, mit dem man Methoden als Parameter im System herumreichen kann. Da geb ich jetzt mal ein Beispiel. Ich hab hier eine Methode "Contain 2 space", die gibt einen Bullwert zurück und nimmt einen String als Parameter. Nun kann ich einen Delegate-Typen deklarieren und zwar mit dem Schlüsselwort "Delegate" und dann schreibe ich eben "Delegate Bull". Ich nenne das ganze Ding jetzt mal "String Tester", um zu zeigen, dass dieser Datentyp jegliche Art Methode annehmen kann, die einen String testen kann. Und dieser String-Tester nimmt dann eben einen String als Parameter an. Also im Grunde genommen ist so eine Delegate-Deklaration wie eine Methodendeklaration, nur dass vorne das Schlüsselwort "L-Gate" dransteht. Und jetzt weiss ich, dass "Stringtester" ein Datentyp, der solch eine Methode annehmen kann, ist. Nun kann ich diesen Datentyp instanzieren wie jeden anderen Datentyp im ".NET" auch. Ich kann also schreiben: "string+tester+equals+new". Nun habe ich einen ganz normalen "Constructor" und dem übergebe ich nun den Namen von dieser Methode. Ich kopiere sie in die Zwischenablage und "paste" sie als Parameter rein. Die Delegate-Variable "Stringtester" ist nun mit dieser Methode initialisiert. Jetzt kann ich diese Variable verwenden um die dahinter stehende Methode aufzurufen. Ich übergebe jetzt hier irgendeinen "String" z.B. "ABC" und dann können wir das Ganze starten. Jetzt kommt hier nichts und der Grund, warum nichts kommt, ist, weil ich auch noch nichts ausgebe. Also baue ich um das ganze Statement ein "Consol.rideline" herum. Nun können wir das Ganze starten und sehen, dass wir ein Ergebnis haben und zwar "false". Das Ergebnis ist "false", weil die Methode auf einen "Whitespace" testet, D.h. sie durchsucht alle "Character" des "Strings" und gibt "True" zurück, sofern einer der "Character" im "Whitespace" ist. Das war jetzt bei "ABC" nicht der Fall. Ich gebe hier einmal eine Ziffer und einen "Whitespace" ein, man wird gleich sehen, warum es eine Ziffer ist. Jetzt kann ich das Ganze noch einmal ausführen: Jetzt kommt "True" zurück, weil ein "Whitespace" drin ist. So einem "Stringtester"-Typ kann ich jede x-beliebige Methode übergeben, die einen "Stringtest.com" mit einem "Bull-Wert" zurückgeben kann, ob dieser Wert nun fehlgeschlagen ist oder ob ein String einem bestimmten Kriterium genügt. Also z.B. könnte ich jetzt sagen, mein Kriterium wäre Contain stigit. Also ich teste ob in dem String eine Ziffer drin ist. Und jetzt schreib ich hier statt 2 Space stigit und damit habe ich eine Methode, die eben auch so einen Digit testet. Und jetzt kann ich ein und denselbens String-Tester Delegate mit diesem Contain Stigit intialisieren. So und wenn das jetzt aufrufe, kommt auch wieder etwas zurück, weil ich eben gerade eine Ziffer hier in den String eingefügt habe. Und so ist es auch. Der Gegentest würde jetzt ergeben, wenn ich die Ziffer jetzt herausnehme nochmal, mit Steuerung F5 das Programmm nochmals neu starte, dann sehe ich hier als Resultat "false". Nun mag der Einwand kommen, warum brauch ich überhaupt zum Aufruf solcher Methoden, so einen Delegate-Typ. Warum rufe ich die Methode nicht direkt auf, und ich möchte mal anhand eines weiteren Bespiels zeigen, warum das mit dem Delegates in vielen Szenarien wesentlich eleganter ist. Ich habe jetzt hier ein anderes Programm. Dieses Programm legt eine Liste an, in der Integer-Werte sind. Diese Werte sind jetzt völlig unsortiert. Und es geht jetzt darum, diese Liste an Werten zu sortieren. Und dafür hat die Klasse "List" eine Methode "Sort". Und diese Methode "Sort" die erwartet jetzt einen Delegate vom Typ "Comparison of Int". Dieses "Int" kommt jetzt natürlich daher, dass ich hier eine "List of Int" deklariert habe. Hätte ich da eine andere Liste deklariert, also zum Beispiel eine "List of String", dann würde die "Sort"-Methode ein "Comparison of String" erwarten. In dem Fall habe ich also jetzt ein "Comparison of Int". Also ein Comparison ist ein Delegate, der eine Methode beschreibt, die zwei Integers als Parameter annimmt und einen Integer-Wert zurückgibt. Und ich kann jetzt Methoden schreiben, die dieser Signatur entsprechen. In dem Fall habe ich jetzt mal zwei Methoden geschrieben, die dieser Signatur entsprechen. Die eine habe ich "Ascending" genannt und die andere habe ich "Descending" genannt. Sie tun im Grunde beide dasselbe, nur in umgekehrter Reihenfolge. Also hier wird von I1 I2 abgezogen, und im anderen Fall wird von I2 I1 abgezogen. Und der jeweils resultierende Wert kommt dann als Integer zurück. Und diese "Sort"-Methode erwartet genau so etwas. Die erwartet als Resultat des Delegates einen Integer, der angibt, ob das jeweilige Element als größer, kleiner oder gleich eingestuft wird. Deswegen sind diese Methoden auch so einfach, weil man beim Integer-Vergleich jetzt direkt mit den Differenzen arbeiten kann. Diese Methode "Sort" hat ja jetzt überhaupt gerade keine Ahnung über die Art und Weise und Beschaffenheit und Implementierung der Methode, die am Ende aufgerufen werden soll. Sie erwartet einfach nur diesen Delegate-Typ. In dem Fall ist es jetzt so, ich übergebe also "ascending" als Delegate und gebe danach diese Liste aus, und jetzt sollte die Liste eigentlich sortiert nach Werten, also mit den kleinsten Werten zuerst erscheinen. Und auch das können wir jetzt wieder ausführen und siehe da, wir haben die Werte sortiert. Und in einem anderen Szenario brauche ich vielleicht das "descending" und wenn ich jetzt das ganze wieder ausführe, dann sind die Werte genau andersrum. Also das heißt, die Delegates anonymisieren Methoden auch in gewisser Weise. Derjenige hier, Codekontext, der einen Delegate erwartet, trifft keinerlei Annahme, über Implementierung der Methode, die über diesen Delegate aufgerufen wird. Er erwartet einfach nur, dass diese Methode von einer bestimmten Signatur ist. Und letztendlich bestimmt dann die Implementierung der Methode, wie zwei Werte verglichen werden und der Vergleichs-Algorhythmus bestimmt dann letztendlich die Reihenfolge der Sortierung. Letztlich ist es eine sehr elegante Art und Weise, wie man das sogenannte Strategy-Pattern anwenden kann. D.h. beim Strategy-Pattern haben wir eine Aufgabe, in dem Fall die Sortierung, oder noch besser gesagt der Vergleich zweier Elemente. Und es gibt verschiedene Strategien, wie man diesen Vergleich ausführen kann. Und diese verschiedenen Strategien spiegeln sich mit verschiedenen Methoden wieder. Während die Aufgabe abstrakt in dem Delegate-Typ beschrieben werden kann. Und so ähnlich ist es dann eben bei den Threads auch, dass die Threads einen bestimmten Delegate-Typ als Parameter erwarten, hinter dem sich so allerlei Implementierungen verbergen können, die dann in einzelnen Threadsausgeführt werden. Dann haben wir in dem Abschnitt jetzt schon mal gelernt, was Delegates sind. Und wir haben schon mal einen ersten Code geschrieben, wie man Delegates zuweist und wie man Delegates ausführt und in welchen Kontexten Delegates sehr sinnvoll sind.

Visual C# 2012 Grundkurs

Schreiben Sie eigene Programme in C# und lernen Sie dazu alle Schlüsselwörter und die meisten Konstrukte kennen, um sicher mit dieser Programmierspreche umzugehen.

7 Std. 1 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!