Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Verwendung von C#-Delegaten (Delegates)

Detaillierte Erläuterung der Verwendung von C#-Delegaten (Delegates)

黄舟
黄舟Original
2016-12-13 13:34:141403Durchsuche

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 );

5. Zuweisungsdelegierter

Da der Delegat ein Referenztyp ist, 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.
del1 = myInstObj.MyM1;
del2 = 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.
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( 参数 ) { 语句块 }
Aus dem Obigen können wir ersehen, dass anonyme Methoden den deklarierten Rückgabewert nicht anzeigen.

delegate int MyDel (int x); //定义一个委托 

MyDel del = delegate( int x){ return x; };

10. Lambda-Ausdruck

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表达式


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn