In diesem Artikel wird hauptsächlich die ausführliche Untersuchung von += und -= in Delegaten in C# vorgestellt. In diesem Artikel wird ausführlich untersucht, was += und -= während der Ausführung bewirken, um das Verständnis und die Verwendung von Delegaten in C# zu vertiefen in Not Sie können sich auf das voranstehende
beziehen
Warum möchten Sie plötzlich über die Inbetriebnahme sprechen? Der Grund liegt in der Idee eines Kollegen . Ich habe gestern auf dem Weg von der Arbeit darüber nachgedacht. Wenn mehrere Methoden beim Delegierten registriert sind, werden sie dann alle ausgeführt? Um die Natur zu erkunden, habe ich eine Demo erstellt, um sie zu studieren.
+=
Jeder weiß, dass Delegaten von System.MulticastDelegate erben und System.MulticastDelegate von System.Delegate erbt. Sie können mehrere Delegaten über die Methode += registrieren. Wurden sie also alle umgesetzt? Was ist das Ergebnis der Ausführung? Sind die Ergebnisse gleich, wenn ein Rückgabewert vorhanden ist und wenn kein Rückgabewert vorhanden ist? Versuchen Sie dann darüber zu sprechen, was += getan hat?
Testcode
Der Code lautet wie folgt:
namespace Wolfy.DelegateDemo { public delegate void ShowMsg(string msg); public delegate int MathOperation(int a, int b); class Program { static ShowMsg showMsg; static MathOperation mathOperation; static void Main(string[] args) { showMsg += ShowHello; showMsg += ShowHello1; showMsg("大家新年好啊"); mathOperation += Add; mathOperation += Multiply; int result = mathOperation(1, 2); Console.WriteLine(result.ToString()); Console.Read(); } static void ShowHello(string msg) { Console.WriteLine("哈喽:" + msg); } static void ShowHello1(string msg) { Console.WriteLine("哈喽1:" + msg); } static int Add(int a, int b) { return a + b; } static int Multiply(int a, int b) { return a * b; } } }
Sie können das laufende Ergebnis erraten, wie unten gezeigt:
Sie können sehen, dass alle ohne Rückgabewerte ausgegeben werden und diejenigen mit Rückgabewerten nur die Ergebnisse von Mutiply ausgeben. Was macht also += intern? Sie können sich den dekompilierten Code ansehen:
Der Code lautet wie folgt:
using System; namespace Wolfy.DelegateDemo { internal class Program { private static ShowMsg showMsg; private static MathOperation mathOperation; private static void Main(string[] args) { Program.showMsg = (ShowMsg)Delegate.Combine(Program.showMsg, new ShowMsg(Program.ShowHello)); Program.showMsg = (ShowMsg)Delegate.Combine(Program.showMsg, new ShowMsg(Program.ShowHello1)); Program.showMsg("大家新年好啊"); Program.mathOperation = (MathOperation)Delegate.Combine(Program.mathOperation, new MathOperation(Program.Add)); Program.mathOperation = (MathOperation)Delegate.Combine(Program.mathOperation, new MathOperation(Program.Multiply)); Console.WriteLine(Program.mathOperation(1, 2).ToString()); Console.Read(); } private static void ShowHello(string msg) { Console.WriteLine("哈喽:" + msg); } private static void ShowHello1(string msg) { Console.WriteLine("哈喽1:" + msg); } private static int Add(int a, int b) { return a + b; } private static int Multiply(int a, int b) { return a * b; } } }
Aus dem obigen Code können Sie sehen, dass += die Delegaten intern durch die Combine-Statik kombiniert Lassen Sie uns einen Blick darauf werfen, wie diese statische Delegationsmethode implementiert wird.
Sie können sehen, dass die CombineImpl-Methode endlich aufgerufen wird. Das Innere dieser Methode ist sehr seltsam:
ist nicht das, was wir sehen wollen. Ich habe den Code, wofür wird diese Methode verwendet?
MSDN-Erklärung
Verkettet die Aufruflisten des angegebenen (kombinierbaren) Multicast-Delegaten und des aktuellen (kombinierbaren) Multicast-Delegaten.
Bedeutet wahrscheinlich: Konvertieren des aktuellen Delegaten. Fügt hinzu der angegebene Multicast-Delegatensatz.
Wurden die Delegaten mit Rückgabewerten nach dem Umrunden eines Kreises ausgeführt? Das lässt sich nur durch Debuggen erkennen. (Im Kreis herumgehen und leider zurück zum Editor)
Fahren Sie mit F11 fort und Sie werden feststellen, dass Sie tatsächlich die Add-Methode eingegeben haben
Es wurde tatsächlich ausgeführt, aber beim Durchlaufen der Multicast-Delegierungssammlung wurde der vorherige Wert überschrieben.
Jetzt können wir also diese Schlussfolgerung ziehen: Bei einem Delegaten ohne Rückgabewert führt er so viele Methoden aus, wie Sie dafür registrieren, und bei einem Delegaten mit Rückgabewert wird dies auch der Fall sein registriert so viele Methoden Wie viele Methoden pro Methode ausgeführt werden, aber der Rückgabewert der letzten Methode zurückgegeben wird.
-=
Da ich += gesagt habe, muss ich als derjenige, der das Chaos aufräumt, -= sagen. Wenn Sie += im Projekt verwenden, müssen Sie -= verwenden, um es freizugeben. Was macht es also intern? Verwenden Sie auch den obigen Code und geben Sie nach der Ausgabe der Ergebnisse mit -= die Ressourcen frei.
Es ist ersichtlich, dass die Verwendung von -= intern die statische Methode Remove des Delegaten aufruft.
Die Verwendung von -= setzt den Delegaten letztendlich auf null. Eine weitere Bedeutung von null ist eine Nullreferenz, sodass Sie auf Müll warten können Sammlung. Das Gerät wurde recycelt.
Zusammenfassung
Obwohl diese Frage sehr einfach ist, stellte sie damals ein Kollege, also erklärte ich sie ihm auf dem Weg nach der Arbeit, ich Ich habe immer darüber nachgedacht, wie ich es intern umsetzen kann. Versuchen Sie es einfach durch Dekompilierung herauszufinden. Es scheint jedoch, dass die CombineImpl-Methode keine zufriedenstellenden Ergebnisse liefert. Ich habe die konkrete Implementierung nicht gesehen. Hoffe das hilft!
Das obige ist der detaillierte Inhalt vonEine ausführliche Erklärung von += und -= der Delegation in C#. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!