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.
delegate void MyDel(int x);
3. Delegierte Variablen deklarieren
MyDel del1,del2;
4. Delegierte Variablen initialisieren
(1) Neuen Operator verwenden
neuer Operator Die Operanden von Methoden können Instanzmethoden oder statische Methoden sein.
(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 = new MyDel( myInstObj.MyM1 ); del2 = new MyDel( SClass.OtherM2 );
del1 = myInstObj.MyM1; del2 = SClass.OtherM2;
MyDel del; del = myInstaObj.MyM1; //委托初始化del = SClass.OtherM2;//委托重新赋值,旧的引用将被回收
Der Delegat ist konstant und der Operandendelegat wird nach seiner Erstellung nicht geändert. Die Delegatenkombination kopiert eine Kopie des Operanden.
7. Addition und Subtraktion delegieren Sie können den Operator += verwenden, um dem Delegaten neue Methoden hinzuzufügen.MyDel del1 = myObj.MyMethod; MyDel del2 = SClass.OtherM2; MyDel del3 = del1 + del2; //组合调用列表
Sie können auch den Operator -= verwenden, um Methoden von Delegaten zu entfernen.
8. Delegate-Aufruf Delegate-Aufruf ähnelt dem Methodenaufruf. Nachdem der Delegat aufgerufen wurde, wird jede Methode in der Aufrufliste ausgeführt.MyDel del = myObj.MyMethod; del += SClass.OtherM2; // 增加方法 del -= myObj.MyMethod; // 移除方法
Bevor Sie den Delegaten aufrufen, sollten Sie feststellen, ob der Delegat leer ist. Der Aufruf eines leeren Delegaten löst eine Ausnahme aus.
9. Anonyme Methoden Anonyme Methoden sind Methoden, die bei der Initialisierung des Delegaten inline deklariert werden.if(null != del) { del();//委托调用 }
Grundstruktur:
Zum Beispiel:deleage( 参数 ) { 语句块 }
delegate int MyDel (int x); //定义一个委托 MyDel del = delegate( int x){ return x; };
Lambda表达式主要用来简化匿名方法的语法。在匿名方法中,delegate关键字有点多余,因为编译器已经知道我们将方法赋值给委托。通过几个简单步骤,我们就可以将匿名方法转换为Lambda表达式:
删除delegate关键字
在参数列表和匿名方法主体之间防Lambda运算符=>。Lambda运算符读作"goes to"。
MyDel del = delegate( int x) { return x; };//匿名方法 MyDel del2 = (int x) => {return x;};//Lambda表达式 MyDel del3 = x => {return x};//简写的Lambda表达式