Delegates Flashcards

1
Q

Delegates

A

Englisches Wort für „Delegierter“ - jemand, der etwas weiterleiten soll
› Ein Delegate leitet einen Methodenaufruf an eine bestimmte Methode weiter
› Entspricht einer Variable in der ein Verweis auf eine Methode gespeichert wird
› Ein Delegate ist ein Typ, der den Zeiger auf eine Methode beschreibt.
› Delegaten-Typen sind von der Klasse Delegate abgeleitet

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Grundlagen Delegates

A

Delegate-Typen sind Datentypen, und zwar Referenztypen
Sie definieren eine Methodensignatur (Parameter & Rückgabetyp).
› Delegate-Objekte speichern Verweise auf Methoden, deren Signatur zum
Delegate-Typ passt. Wenn das Objekt aufgerufen wird, ruft es die gespeicherten
Methoden auf.
› Man kann sich ein Delegate-Objekt wie ein Testament vorstellen:
› Zu Lebzeiten werden verschiedene Anweisungen (Methoden) im Testament
(Delegate) hinterlegt.
› Nach dem Tod wird das Testament eröffnet (Aufruf des Delegate) und die
Anweisungen ausgeführt (Methodenaufruf).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Multicast Delegates

A

› Mehrere Delegates können zu einem einzigen zusammengefasst werden
› Dadurch entsteht ein Delegate-Verbund, der auch als Multicast-Delegate
bezeichnet wird
› Durch den Aufruf eines Delegates können mehrere Methoden ausgeführt
werden
› Es gibt zwei Möglichkeiten, um aus einem Delegaten einen Multicast-Delegaten
zu machen:

die Methode Combine der Klasse Delegate

der += Operator
› Die Methode Combine wird selten oder gar nicht verwendet.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Multicast Delegates

A

Mittels += Operator weitere Delegates einem Delegate hinzufügen

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Zusammenfassung

A

Delegate-Objekte können auch
mehrere Methoden-Referenzen
aufnehmen.
Bei Aufruf des Delegate-Objekts
werden diese in der Reihenfolge
ausgeführt, in der sie gespeichert
wurden.
Methoden-Referenzenkönnen
aus dem Delegate-Objekt auch
wieder entfernt werden.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Warum Delegates?

A

Man kann jetzt also eine oder mehrere Methoden über ein Delegate-Objekt
aufrufen.
Aber wo ist der Sinn dabei? Man könnte die Methoden doch auch direkt
aufrufen?
Mit Delegate-Objekten können Methoden an andere Methoden als Parameter
weitergegeben werden.
Man kann also Methoden schreiben, die selbst gar nicht wissen welchen Code
sie ausführen werden.
Diesen Code bekommen sie von außen beim Aufruf übergeben.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Warum Delegates?

A

Ein Delegatenobjekt kann z. B. als Argument verwendet werden beim Aufruf einer
Methode, die einen Parameter mit Delegatentyp besitzt. Dann wird der
„Rahmenmethode“ beim Aufruf eine „Hilfsmethode“ übergeben, die innerhalb der
Rahmenmethode als Funktionsergänzung verwendet wird.
›Man kann hier von einer Funktionsinjektion sprechen. Weiterhin kann der
Rahmenmethode per Delegatenobjekt die Möglichkeit zur Kommunikation per
Rückruf gegeben werden.
›Funktionsinjektion und Rückrufkommunikation sind auch beim Klassendesign von
Nutzen und hier über Felder bzw. Mitgliedsobjekte mit Delegatentyp zu realisieren.
›Ein wichtiges Beispiel sind die Steuerelementklassen für WPF-Anwendungen (z. B.
Application, Button), die sogenannte Ereignisse anbieten (z. B. Exit, Click), bei denen
Instanzvariablen mit Delegatentyp eine wesentliche Rolle spielen.
Ereignisinteressenten befördern eine Methode in das Delegatenobjekt zum Ereignis.
Wenn das Ereignis eintritt, d.h. wenn das Delegatenobjekt zum Ereignis aufgerufen
wird, dann wird die im Delegatenobjekt registrierte Methode ausgeführt.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Anonyme Methoden

A

Bisher muss man jede Methode, die in einem Delegate-Objekt
gespeichert werden soll, extra anlegen.
› Insbesondere beim letzten Beispiel mit den Filter-Methoden ist das
aber sehr unpraktisch. Sobald man das Array nach einem neuen
Kriterium filtern will, muss man eine neue Methode schreiben.
› Diese Methoden haben meist einen sehr kurzen Rumpf und
werden nur durch den Methoden-Kopf stark aufgebläht.
› In C# kann man aber auch anonyme Methoden schreiben, d.h.
Methoden die keinen Namen haben. Diese werden direkt an der
Stelle erzeugt, wo sie gebraucht werden, wo man ein Delegate-
Objekt einsetzen kann.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Lambdaausdruck

A

Ein Lambda-Ausdruck ist eine Funktion, die einem Lambda-Operator (=>),
eine Parameterliste sowie einen Anweisungsblock hat. Lambda-Ausdrücke
eignen sich hervorragend für den Einsatz in Delegates.
› Lambda-Ausdrücke sind nur ähnlich wie anonyme Methoden. Sie können sich
aber exakt genauso verhalten wie anonyme Methoden. Dazu müssen sie
lediglich einem delegate zugewiesen werden. Sie sind eine Weiterentwicklung
der anonymen Methoden.
›Lambda Ausdrücke sind eine abkürzende Schreibweise für anonyme Methoden
und können überall dort eingesetzt werden, wo man eine anonyme Methode
verwenden kann.
› Lamda Ausdrücke können für die Erstellung von Delegates verwendet werden.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Ausdruck, Anweisungsblock

A

Auf der rechten Seite des Lambda-Operators steht die eigentliche Methode. Ein
Anweisungsblock kann aus keiner, einer oder mehreren Anweisungen bestehen.
Diese werden in geschweifte Klammern geschrieben.
› Wenn der Anweisungsblock aus nur einem Ausdruck besteht (z.B. aus nur einer
return-Anweisung), dann kann man die geschweiften Klammern auch
weglassen. Je nach Kontext ist das was übrig bleibt dann entweder der
Rückgabewert der Funktion, oder (wenn das delegate so definiert ist, dass kein
Rückgabewert erwaret wird) die einzige Zeile.
› Wenn man gar nichts tun will, dann muss ein leeres Klammernpaar geschrieben
werden.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Vordefinierte Delegates

A

Action-Delegates
› Func-Delegates
› Predicate-Delegates

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Vordefinierte Delegates

A

Die Methoden, die der allgemeinen Filterfunktion übergeben werden, kann man
nun also anonym bei Bedarf schreiben.
› Aber man muss immer noch einen Delegate-Typ definieren, den man dann als
Parameter-Typ in der Filterfunktion verwendet.
› C# bringt aber schon vordefinierte generische Delegate-Typen mit, die man
genau in solchen Situationen verwenden kann:
› Action-Delegates
› Func-Delegates
› Predicate-Delegates

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Action-Delegate

A

Action<> wird verwendet, wenn eine Aktion mithilfe der Argumente des Delegaten
ausgeführt werden muss. Die von dem Typ gekapselte Methode gibt keinen Wert
zurück.
Die Signatur darf maximal 16 Argumente enthalten.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Func-Delegate

A

Func<> wird üblicherweise verwendet, wenn eine Transformation ausgeführt werden
muss, Sie also die Argumente des Delegaten in ein anderes Ergebnis transformieren
müssen. Die von dem Typ gekapselte Methode gibt einen angegebenen Wert zurück.
Die Signatur darf maximal 16 Argumente enthalten.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Predicate-Delegate

A

Predicate<> wird verwendet, wenn Sie ermitteln müssen, ob das Argument die
Bedingung des Delegaten erfüllt.
Kann auch als Func-Delegate geschrieben werden:
Func<int, bool> FuncDel = (i) => i % 2 == 0;

How well did you know this?
1
Not at all
2
3
4
5
Perfectly