1. Was ist Delegation?
Eigentlich habe ich darüber nachgedacht, wie ich die Delegation ausführlicher erklären kann. Ehrlich gesagt hat jeder eine andere Meinung, weil er das Problem aus unterschiedlichen Blickwinkeln betrachtet. Persönlich denke ich, dass es aus den folgenden zwei Punkten verstanden werden kann:
(1) In Bezug auf die Datenstruktur ist die Delegation ein benutzerdefinierter Typ wie eine Klasse.
(2) In Bezug auf Entwurfsmuster stellt die Delegation (Klasse) die Abstraktion von Methoden (Objekten) bereit.
Welche Daten speichert ein Delegat, da er ein Typ ist?
Wir wissen, dass ein Delegat eine Abstraktion einer Methode ist und die Adressen einer Reihe von Methoden mit derselben Signatur und demselben Rückgabetyp speichert. Wenn ein Delegat aufgerufen wird, werden alle im Delegaten enthaltenen Methoden ausgeführt.
2. Definition des Delegatentyps
Ein Delegat ist ein Typ, genau wie eine Klasse ein Typ ist. Wie Klassen müssen Delegattypen deklariert werden, bevor sie zum Erstellen von Variablen und Typobjekten verwendet werden können.
delegate void MyDel(int x);
Deklaration des Delegate-Typs:
(1) Beginnt mit dem Schlüsselwort „delegate“.
(2) Rückgabetyp + Name des Delegatentyps + Parameterliste.
3. Delegierte Variablen
MyDel del1,del2;
4. Delegatvariablen initialisieren
(1) Verwenden Sie den neuen Operator
Die Operanden des neuen Operators setzen sich wie folgt zusammen:
Delegierter Typname
Eine Reihe von Klammern, die die Methode enthalten, die das erste Mitglied des Anruflistennamens ist. Methoden können Instanzmethoden oder statische Methoden sein.
del1 = new MyDel( myInstObj.MyM1 ); del2 = new MyDel( SClass.OtherM2 );
(2) Verwenden Sie die Verknüpfungssyntax
Verknüpfungssyntax, die nur aus Methodenspezifizierern besteht. Dies funktioniert, weil es eine implizite Konvertierung zwischen dem Methodennamen und dem entsprechenden Delegate-Typ gibt.
del1 = myInstObj.MyM1; del2 = SClass.OtherM2;
5. Zuweisung von Delegaten
Da Delegaten Referenztypen sind, können wir die in der Delegate-Variablen enthaltene Methodenadressenreferenz ändern, indem wir ihr einen Wert zuweisen . Alte Referenzen werden vom Garbage Collector zurückgefordert.
MyDel del; del = myInstaObj.MyM1; //委托初始化 del = SClass.OtherM2;//委托重新赋值,旧的引用将被回收
6. Delegierte kombinieren
Delegierte können mithilfe zusätzlicher Operatoren kombiniert werden. Diese Operation erstellt letztendlich einen neuen Delegaten, dessen Anrufliste die Verkettung von Kopien der Delegaten-Anruflisten der beiden Operanden ist.
Der Delegat ist konstant und der Operandendelegat wird nach seiner Erstellung nicht geändert. Die Delegatenkombination kopiert eine Kopie des Operanden.
MyDel del1 = myObj.MyMethod; MyDel del2 = SClass.OtherM2; MyDel del3 = del1 + del2; //组合调用列表
7. Additions- und Subtraktionsoperationen delegieren
Sie können den Operator += verwenden, um dem Delegaten neue Methoden hinzuzufügen.
Sie können auch den Operator -= verwenden, um Methoden von Delegaten zu entfernen.
MyDel del = myObj.MyMethod; del += SClass.OtherM2; // 增加方法del -= myObj.MyMethod; // 移除方法
8. Delegate-Aufruf
Delegate-Aufruf ähnelt dem Methodenaufruf. Nachdem der Delegat aufgerufen wurde, wird jede Methode in der Aufrufliste ausgeführt.
Bevor Sie den Delegaten aufrufen, sollten Sie feststellen, ob der Delegat leer ist. Der Aufruf eines leeren Delegaten löst eine Ausnahme aus.
if(null != del) { del();//委托调用}
9. Anonyme Methoden
Anonyme Methoden sind Methoden, die bei der Initialisierung des Delegaten inline deklariert werden.
Grundstruktur:
deleage( 参数 ) { 语句块 }
Zum Beispiel:
delegate int MyDel (int x); //定义一个委托 MyDel del = delegate( int x){ return x; };
Aus dem Obigen können wir ersehen, dass anonyme Methoden den deklarierten Rückgabewert nicht anzeigen.
10. Lambda-Ausdruck
Der Lambda-Ausdruck wird hauptsächlich zur Vereinfachung der Syntax anonymer Methoden verwendet. Bei anonymen Methoden ist das Schlüsselwort „delegate“ etwas überflüssig, da der Compiler bereits weiß, dass wir die Methode dem Delegaten zuweisen. Mit ein paar einfachen Schritten können wir eine anonyme Methode in einen Lambda-Ausdruck umwandeln:
Entfernen Sie das Delegate-Schlüsselwort
Verhindern Sie den Lambda-Operator zwischen der Parameterliste und dem anonymen Methodenkörper => Der Lambda-Operator wird „goes to“ ausgesprochen.
MyDel del = delegate( int x) { return x; };//匿名方法 MyDel del2 = (int x) => {return x;};//Lambda表达式 MyDel del3 = x => {return x};//简写的Lambda表达式