


Une explication approfondie de += et -= de délégation en C#
Cet article présente principalement l'étude approfondie de += et -= des délégués en C#. Cet article étudie en profondeur ce que += et -= font pendant l'exécution pour approfondir la compréhension et l'utilisation des délégués C# dans Friends. besoin Vous pouvez vous référer au
écrit devant
Pourquoi avez-vous soudainement envie de parler de mise en service La raison est à cause de l'idée d'un collègue. J'ai continué à y penser en sortant du travail hier. Question, si plusieurs méthodes sont enregistrées auprès du délégué, seront-elles toutes exécutées ? Afin d'explorer la nature, j'ai réalisé une démo pour l'étudier.
+=
Tout le monde sait que les délégués héritent de System.MulticastDelegate et que System.MulticastDelegate hérite de System.Delegate. Vous pouvez enregistrer plusieurs délégués via la méthode +=. Alors ont-ils tous été mis en œuvre ? Quel est le résultat de l’exécution ? Les résultats sont-ils les mêmes s’il y a une valeur de retour et s’il n’y a pas de valeur de retour ? Alors essayez de parler de ce que += a fait ?
Code de test
Le code est le suivant :
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; } } }
Vous pouvez deviner le résultat de l'exécution, comme indiqué ci-dessous :
Vous pouvez voir que tous ceux sans valeurs de retour sont affichés, et ceux avec des valeurs de retour n'affichent que les résultats de Mutiply. Alors, que fait += en interne ? Vous pouvez jeter un œil au code décompilé :
Le code est le suivant :
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; } } }
À partir du code ci-dessus, vous pouvez voir que += combine en interne les délégués via le Combine static méthode du délégué. Vous pouvez Voyons comment cette méthode statique de délégation est implémentée.
Vous pouvez voir que la méthode CombineImpl est finalement appelée. L'intérieur de cette méthode est très étrange :
n'est pas ce que nous voulons voir. J'ai le code, à quoi sert cette méthode ?
Explication de MSDN
Concatène les listes d'appel du délégué de multidiffusion (combinable) spécifié et du délégué de multidiffusion (combinable) actuel.
Signifie probablement : Convertir le délégué actuel Ajoute à l’ensemble de délégués de multidiffusion spécifié.
Après avoir tourné en rond, les délégués avec des valeurs de retour ont-ils été exécutés ? Cela ne peut être vu que via le débogage. (Faire le tour en rond et revenir à l'éditeur, hélas)
Continuez F11 et vous constaterez que vous avez bien entré la méthode Add
Il a effectivement été exécuté, mais lors du parcours de la collection de délégations multicast, la valeur précédente a été écrasée.
Nous pouvons donc maintenant tirer cette conclusion : pour un délégué sans valeur de retour, il exécutera autant de méthodes que vous vous y inscrivez, et pour un délégué avec une valeur de retour, ce sera également enregistré autant de méthodes Combien de méthodes sont exécutées par méthode, mais la valeur de retour de la dernière méthode est renvoyée.
-=
Puisque j'ai dit +=, alors en tant que celui qui nettoie le désordre, je dois dire -=. Si vous utilisez += dans le projet, vous devez utiliser -= pour le publier. Alors, que fait-il en interne ? Utilisez également le code ci-dessus et après avoir affiché les résultats, utilisez -= pour libérer les ressources.
On peut voir que l'utilisation de -= appelle en interne la méthode statique Remove du délégué.
L'utilisation de -= définit finalement le délégué sur null Une autre signification de null est une référence null, afin que vous puissiez attendre des déchets. collecte. L'appareil a été recyclé.
Résumé
Bien que cette question soit très basique, un collègue l'a posée à l'époque, alors je lui ai expliqué En sortant du travail, je. J'ai continué à réfléchir à la façon de l'implémenter en interne ? Essayez simplement de le découvrir grâce à la décompilation. Mais il semble que la méthode CombineImpl ne donne pas de résultats satisfaisants. Je n'ai pas vu la mise en œuvre spécifique. J'espère que cela aide!
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'Active Directory avec C#. Nous discutons ici de l'introduction et du fonctionnement d'Active Directory en C# ainsi que de la syntaxe et de l'exemple.

Guide du générateur de nombres aléatoires en C#. Nous discutons ici du fonctionnement du générateur de nombres aléatoires, du concept de nombres pseudo-aléatoires et sécurisés.

Guide de la vue Grille de données C#. Nous discutons ici des exemples de la façon dont une vue de grille de données peut être chargée et exportée à partir de la base de données SQL ou d'un fichier Excel.

Guide des modificateurs d'accès en C#. Nous avons discuté de l'introduction Types de modificateurs d'accès en C# ainsi que d'exemples et de résultats.

Guide de sérialisation C#. Nous discutons ici de l'introduction, des étapes de l'objet de sérialisation C#, du fonctionnement et de l'exemple respectivement.

Guide des modèles en C#. Nous discutons ici de l'introduction et des 3 principaux types de modèles en C# ainsi que de ses exemples et de l'implémentation du code.

Guide des nombres premiers en C#. Nous discutons ici de l'introduction et des exemples de nombres premiers en c# ainsi que de l'implémentation du code.

Guide de Factorial en C#. Nous discutons ici de l'introduction de factorial en c# ainsi que de différents exemples et de l'implémentation du code.
