Visual C# 2011 Grundkurs

Delegates

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
In C# kann man Code ausführen, den es eigentlich noch gar nicht gibt. Das glauben Sie nicht? Hier der Beweis!
09:46

Transkript

Schauen wir uns mal an, wie wir "Internetcode" ausführen können, in unserem Code, der eigentlich noch gar nicht geschrieben ist. Das klingt auf den ersten Blick vielleicht ein bisschen verwirrend. So etwas kann man mit "Delegates" lösen. Wie wir das machen, schauen wir in diesem Video an. Das Ganze möchte ich an einem kleinen Beispiel demonstrieren. In diesem Beispiel bauen wir uns eine Klasse "Button" und diesen Button kann man sich vorstellen wie so einen Oberflächenbutton. Wenn man darauf drückt auf diesen "Button", dann ist das ein "Konsolen-Button" und den kann man nur in der Konsole benutzen. Das ist ein etwas merkwürdiges Beispiel, aber wir werden nachher sehen, auf was ich hinaus will, dass man dieses Konzept vollständig versteht. Wir legen uns zunächst erstmal eine "Klasse" an über hinzufügen, dann auf "Klasse" und nennen diese mal einfach nur "Button". Wir landen hier in unserer Quellcode-Datei und in der Quellcode-Datei möchten wir jetzt, dass es eine "Methode" gibt. Diese Methode ist "Public", kein Rückgabewert, heißt "Click" und wenn diese Methode "Click" aufgerufen wird, ist das theoretisch so, als wenn jemand in der Oberfläche auf einen "Button" klicken würde. Wir haben hier noch keine Oberflächen, deswegen machen wir so einen "Konsolen-Button", der das Ganze nachahmt. Jetzt stellen Sie sich vor, Sie sind Entwickler dieser Klasse "Button". Diese Klasse "Button" wollen Sie nachher verkaufen und möchten sie anderen Entwicklern zur Verfügung stellen. Jetzt können wir sagen, wenn "Click" aufgerufen wird, dann soll in der Konsole mit "Write.Line" aufgerufen werden "Ich wurde geklickt". Wenn wir jetzt in unsere Program-CS gehen, dann erstellen wir uns von unserem Button ein "Objekt", Objekt "B", erstellen uns eine "Instanz" und dann rufen wir auf "B" mal "Click" auf. Jetzt haben wir gerade schon gesagt, wir möchten diesen Button irgendwann mal verkaufen. Wenn ich diese Methode ausführe, dann wird der Text "Ich wurde geklickt" ausgegeben. Super! Aber wir möchten diesen Button später mal anderen Entwicklern zur Verfügung stellen und wenn dann auf diesen Button geklickt wird, dann soll nicht der Code ausgeführt werden, den wir gerne hätten, sondern der Code, den der Entwickler definiert. Stellen Sie sich vor, Sie erstellen nachher Oberflächen und Sie möchten einen Button verwenden und können gar nicht bestimmen, was passiert, wenn Sie auf diesen Button klicken, sondern es wird immer derselbe Code, den irgendwer mal defniert hat, ausgeführt. Das bringt es einfach nicht. Das bringt keinen Mehrwert. Das wird uns keine Funktionalät bringen. Deswegen gibt es "Delegaten". "Delegaten" sind eine Art Zeiger, die auf entfernte Methoden zeigen können. Wenn ich dann diesen "Delegaten ausführe", dann führt er in Wirklichkeit die Methode aus, auf die dieser Delegat zeigt. Klingt jetzt ein bisschen kompliziert. Wir schauen uns das Ganze einfach mal an. Ein "Delegat" ist ein eigener Datentyp, also ein Datentyp wie z.B. eine "Klasse". Diesen Delegaten muss ich jetzt zunächst einmal definieren, bevor ich ihn benutzen kann. Und einen Delegaten definiere ich folgendermaßen, indem ich zunächst erstmal anfange mit der Sichtbarkeit. Ich sage also, dieser Delegat ist "Public", das heißt, er ist nach außen hin sichtbar. Dann sagen wir ihm, dass es ein Delegat ist mit dem Schlüsselwort "Delegate". Und jetzt müssen wir ihm sagen, auf welche Art von Methoden er zeigen kann. Nun zunächst müssen wir ihm sagen, welchen Rückgabewert diese Methode hat, auf die er zeigt. Wir entschließen uns mal für eine "Void-Methode", also eine rückgabelose Methode. Dann müssen wir einen Namen für diesen Delegaten finden. Es hat sich im Internet so etabliert mittlerweile, dass man irgendein Wort nimmt, z.B. "Click" und dann hinten das Wort "Handler" dahinter schreibt. Dadurch weiß jeder Netzentwickler, der das sieht: "Aha, das ist ein Delegat!". Jetzt muss ich angeben, welche Parameter die Methode hat, auf die dieser Delegat zeigt. Bei uns ist es jetzt erstmal eine Methode, die keine Parameter hat. Damit ist die Definition von diesem Delegaten abgeschlossen. Jetzt kann ich von diesem Delegaten ein "Objekt" erzeugen und dieses Objekt zeigt auf eine spezielle Methode. Das Ganze, also diese Funktionsweise schauen wir uns jetzt, bevor wir das in diese Klasse "Button" einbauen, erstmal in der Klasse "Program" an. Wir legen uns erstmal hier unten eine neue "Methode" an, die so aussieht, von der Signatur her, dass wir mit dem Delegaten darauf zeigen können. Wir haben den Delegaten so definiert, dass er auf eine Methode zeigen kann, die keinen Rückgabewert hat, also "void" und dann nennen wir sie mal "My Click Method" und diese Methode darf keine Parameter haben. Dann geben wir mal aus, mein eigener Text. Das ist also jetzt die Methode, die wir später ausführen wollen, mit diesem Delegaten. Wie gesagt, wir fangen jetzt erstmal an, dass hier in der Konsole kurz vorzuführen und später bauen wir das in unseren Button ein. Von meinen Delegaten muss ich mir jetzt zunächst mal ein "Objekt" erzeugen. Ein Objekt erzeuge ich so wie auch normalerweise mit einer Klasse. Ich gebe also erstmal an, dass ich hier meinen "ClickHandler" habe. Das ist der Datentyp von dieser Referenz, die ich jetzt herstelle und wir nennen das mal "DEL" für Delegat und jetzt sagen wir hier mit "New" er soll mir eine neue Instanz von diesem Delegaten erstellen. Wenn ich mir jetzt diesen Konstruktor angucke, dann ist es im ersten Moment ein bisschen verwirrend. Dieser Konstruktor erwartet den Namen einer Methode, die keinen Rückgabetyp hat, die also "void" ist und keine Parameter erwartet, quasi genau das, was wir in unserem Delegaten definiert haben, als wir diesen Typ erstellt haben. Also, kein Rückgabetyp, keine Parameter, passt zu "My Click Method", die wir gerade definiert haben und damit haben wir jetzt einen Delegaten erzeugt, der unten auf diese Methode "My Click Method" zeigt. Wir haben zunächst einen Delegaten definiert. Dieser Delegat zeigt auf eine bestimmte Art von Methoden. Diese Methode darf keinen Rückgabenyp haben und diese Methode darf keine Parameter haben. Dann haben wir uns eine Methode erstellt, die zu dieser Signatur passt, also keinen Rückgabetyp hat, keinen Parameter. Dann haben wir uns an dieser Stelle ein Objekt von diesem Delegaten erzeugt. Dieses Objekt zeigt auf "My Click Method", die Methode, die wir definiert haben und diese Referenz speichern wir in der Variable "DEL". Anschließend gehen wir hin und können diese Variable "DEL" genauso aufrufen, wie eine ganz normale Methode. Wir schauen uns das einmal im Debugger an, um zu sehen, wie das Ganze funktioniert. Ich führe das Ganze aus, wir befinden uns mit dem Debug-Cursor in dieser Zeile. Ich führe sie mit F11 aus und dann sieht man hier, dass dieser Delegat auf eine Methode zeigt und das ist: "Void-My Click Method", also genau diese Methode. Auf diese Methode zeigen heißt, wenn ich diesen Delegaten ausführe, führe ich gleichzeitig diese Methode aus. Das heißt, wenn ich jetzt hier in den Aufruf des Delegaten reinspringe mit F11, springe ich unten in die Methode rein. Das heißt, wir können das Ganze jetzt in unseren Button einsetzen, um einen Code auszuführen, der eigentlich noch gar nicht bekannt war, als wir unseren Button geschrieben haben. Wir löschen das an der Stelle mal wieder. Wie gesagt, das war nur zur Demonstration. Zunächst muss ich natürlich das Debuggen beenden. Dann gehen wir mal in unseren Button rein. Zunächst müssen wir uns eine Variable von diesem ClickHandler anlegen. Wir erstellen also ein "Public-Feld" vom Typ "ClickHandler" und nennen das "Clicked". Jetzt kann ich hier in meiner Methode "Click" hingehen und kann diesen Delegaten einfach aufrufen. Den Button könnten wir jetzt nehmen, zusammen mit der Typdefintion des ClickHandlers und könnten die irgendeinem x-beliebigem Entwickler geben. Der Entwickler will natürlich, dass wenn man auf den Button klickt, nicht unser geschriebener Code ausgeführt wird, eben die Ausgabe, die wir gesehen haben, sondern sein Code. Gut, das können wir mit den Delegaten ganz einfach machen. Wir gehen mal hier zurück in unseren Quelltext. Das ist die Methode, die uns der fremde Entwickler geschrieben hat und die möchte er gerne ausgeführt haben, wenn man auf diesen Delegaten klickt, wenn man diese Klickmethode aufruft natürlich. Das Ganze machen wir derart, dass wir einfach hingehen und sagen "B-Clicked=New" und dann der ClickHandler und dann der Name unserer Methode, das ist "My Click Method". Das heißt ich gehe jetzt in diese Klasse "Button". Dort habe ich einen Delegaten definiert. Dieser Delegat ist derzeit "Public" und an diesem Delegaten weise ich ein Objekt von ClickHandler zu und dieses Objekt von ClickHandler, also der Delegat zeigt auf meine Methode "My Click Method". Wir schauen uns das Ganze einmal an, Breakpoint in die Zeile, füllen es aus und dann staten wir mit F11 in diese Zeile. Sie sehen also jetzt hier in meinem Button habe ich diesen Delegaten geklickt und der zeigt auf "My click method". Wir springen an dieser Zeile in den Aufruf der "Click-Methode", also da wird quasi unser "Konsolen-Button" geklickt. Ich springe in die Methode "Click" und dort wird jetzt keine "Console Write Memo" aufgerufen, sondern einfach dieser Delegat. Indem ich diesen Delegat aufrufe, wird natürlich die Methode aufgerufen, auf die dieser Delegat zeigt und die haben wir ja von außerhalb dran gehangen. Also heißt, dass wenn ich die F11 drücke, springt der hier unten in "My Click Method" und damit wird der Code ausgeführt, der eigentlich zur Entwicklungzeit unseres Buttons überhaupt noch gar nicht vorhanden war. Wir müssen jetzt noch eine kleine Schönheitskorrektur vornehmen und zwar kann es ja durchaus sein, dass wir irgendwann mal auf unseren Button klicken, in diesem Button aber noch gar kein ClickHandler angehangen wurde, also noch kein Objekt zugewiesen wurde. Deshalb muss man hier oben mit einer einfachen "If-Abfrage" prüfen, ob "Clicked ungleich Null" ist. Wenn "Clicked ungleich Null" ist, dann führt man diesen Delegaten einfach aus. Wir haben in diesem Video gesehen, was man machen kann, um einen Code auszuführen, der eigentlich zur Entwicklungszeit noch gar nicht vorhanden war, als wir unseren Code geschrieben haben. Das Ganze kann man mit Delegaten machen. Das ist natürlich ein anderes Szenario, aber man kann mit solchen Delegaten auch sogenannte "lose gekoppelte Anwendungen" erstellen. Das heißt, mein Objekt löst irgendein Ereignis aus und weiß gar nicht, welche Objekte dies behandelt. Die Klasse "Button" weiß auch nicht, wo dieser ClickHandler hinzeigt, den ich an der Stelle auslöse. Das ist einfach irgendein Programm, von dem man gar nichts weiß. Und diese Fähigkeit, Code auszuführen, obwohl man eine andere Klasse nicht kennt, man quasi keine enge Verbindung zwischen diesen Klassen hat, nennt man "lose Kopplung". Damit wir unseren Delegaten ClickHandler nutzen konnten, mussten wir zunächst hier unten einen eigenen "Typ" erstellen. So ein Delegat ist quasi so ein Typ wie eben eine Klasse. Wir mussten sagen, dass dieser Delegat auf eine bestimmte Art von Methoden zeigt, nämlich ohne Rückgabewert und ohne Parameter. Natürlich hätte man auch Delegaten erstellen können, die Rückgabewerte haben bzw. auf Methoden mit Parametern zeigen.

Visual C# 2011 Grundkurs

Steigen Sie in die C#-Programmierung ein und lernen Sie sowohl die Grundlagen der Sprache C# als auch die Entwicklungsumgebung Visual Studio 2010 und .NET-Framework kennen.

7 Std. 28 min (81 Videos)
Derzeit sind keine Feedbacks vorhanden...
Hersteller:
Software:
Visual Studio Visual Studio 2010
Exklusiv für Abo-Kunden
Erscheinungsdatum:27.06.2011

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!