Maison  >  Article  >  développement back-end  >  Une explication approfondie de += et -= de délégation en C#

Une explication approfondie de += et -= de délégation en C#

Y2J
Y2Joriginal
2017-04-21 14:15:254241parcourir

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn