Maison > développement back-end > Tutoriel C#.Net > Compilation des connaissances de base C# Connaissances de base (20) Délégation (1)

Compilation des connaissances de base C# Connaissances de base (20) Délégation (1)

黄舟
Libérer: 2017-02-11 13:59:48
original
1398 Les gens l'ont consulté

Les délégués et les événements sont beaucoup utilisés en C#, en particulier lors de la programmation de formulaires. De nombreuses opérations doivent être traitées et livrées via des délégués et des événements. Voici une explication détaillée de l'utilisation et des raisons des délégués et des événements, afin que nous puissions les comprendre plus clairement lors de l'écriture du code.
L'utilisation de la délégation
Les événements sont un mécanisme et les événements sont mis en œuvre par délégation. Par conséquent, si vous comprenez la délégation, vous aurez une meilleure compréhension des événements. Regardons un petit exemple ci-dessous.
Voici le code pour décrire les programmeurs dans différents langages :
Par exemple, nous décrivons un programmeur utilisant C# comme ceci, où le paramètre programerName représente le nom du programmeur.

        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }
Copier après la connexion

Utilisez Java,

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }
Copier après la connexion

Avec autant de langages, comment savoir de quel programmeur il s'agit ? Utilisez une énumération pour représenter,

    public enum ProgramLanguage
    {
        CSharp,

        C,

        Java
    }
Copier après la connexion

Puis donnez une description complète, le code est le suivant :

   public class ProgramerDescription
    {
        //01
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }

        //02
        public void Description(string programerName, ProgramLanguage type)
        {
            switch (type)
            {
                case ProgramLanguage.CSharp:

                    CsharpProgramer(programerName);

                    break;

                case ProgramLanguage.C:

                    CProgramer(programerName);

                    break;

                case ProgramLanguage.Java:

                    JavaProgramer(programerName);

                    break;

                default:

                    Console.WriteLine("A kind of new Language that you never heard of.");

                    break;
            }
        }
    }

    public enum ProgramLanguage
    {
        CSharp,

        C,

        Java
    }
Copier après la connexion

Appelez :

            ProgramerDescription pm = new ProgramerDescription();

            pm.Description("杨友山", ProgramLanguage.CSharp);
Copier après la connexion

À ce moment , sortie "Yang Youshan utilise la programmation C#!";
De cette manière, une implémentation simple de la description du programmeur a été initialement réalisée. La méthode Description utilise ici un type d’énumération pour distinguer différentes langues. De cette façon, sa maintenabilité est relativement mauvaise, car il existe de nombreux langages de programmation​​(C, PHP, etc.). Si vous souhaitez ajouter un langage, vous devez ajouter une méthode correspondante, puis vous devez modifier le. Type d’énumération ProgramLanguage. L'ajout de méthodes aura peu d'impact sur le programme d'origine, car il peut être implémenté à l'aide de classes partielles, mais modifier l'énumération n'est pas approprié. Cela n'est pas conforme au principe ouvert et fermé de la conception orientée objet.
Alors, comment le gérer dans la méthode Description, c'est-à-dire, sans énumération, comment la méthode Description distingue-t-elle quelle méthode (CsharpProgramer, CProgramer, JavaProgramer) appeler pour décrire le programmeur.
public void Description(string programerName, un certain paramètre d'un certain type)
{
//Appelle la méthode correspondante
>
Le certain type ici est utilisé pour distinguer le type dont En d’autres termes, il est préférable de passer directement ici la méthode que je souhaite appeler en tant que paramètre. Par exemple, je souhaite appeler la méthode CProgramer pour décrire un programmeur C,
          ProgramerDescription pm = new ProgramerDescription(); Comment exprimer "un certain type et un certain paramètre" de Description(string programerName, un certain type et un certain paramètre) ?

Bien sûr on pense au délégué en C#. Un délégué est une structure de données qui fait référence à une méthode statique ou fait référence à une instance de classe et aux méthodes d'instance de cette classe. Utilisez un délégué pour compléter le code ci-dessus :



Appel :

    public class ProgramDescriptionDelegate
    {
        //委托,表示方法
        public delegate void DescriptionDelegate(string programerName);

        //01
        public void CsharpProgramer(string programerName)
        {
            Console.WriteLine(string.Format("{0} 使用C#编程!", programerName));
        }

        public void CProgramer(string programerName)
        {
             Console.WriteLine(string.Format("{0}使用C语言编程!", programerName));
        }

        public void JavaProgramer(string programerName)
        {
             Console.WriteLine(string.Format("{0} 使用Java语言编程!"));
        }

        //02
        public void Description(string programerName, DescriptionDelegate description)
        {
            description(programerName);
        }
    }
Copier après la connexion

Le résultat est le même que le code d'origine.

Qu'est-ce que la délégation ? MSDN l'explique ainsi : un délégué est un type qui définit une signature de méthode, peut être associé à n'importe quelle méthode avec une signature compatible et peut être appelé via le délégué. Les délégués sont utilisés pour transmettre des méthodes en tant que paramètres à d’autres méthodes. Les gestionnaires de temps sont des méthodes appelées via des délégués.
            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            pm.Description("杨友山", pm.CsharpProgramer);
Copier après la connexion

Examinez attentivement le code en utilisant le délégué,
public void Description(string programerName, DescriptionDelegate description). Lors de l'appel, la description

DescriptionDelegate est transmise dans pm.CsharpProgramer, c'est-à-dire description=pm.CsharpProgramer à ce moment-là. En fait, on peut aussi l'appeler ainsi :



Résultat :

                    //方法和委托绑定
            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                csharpDelegate = pm.CsharpProgramer;

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                cdelegate = pm.CProgramer;

            pm.Description("杨友山", csharpDelegate);

            pm.Description("D.M.Ritchie", cdelegate);
Copier après la connexion

Modifier à nouveau :

Résultat :

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                pdelegate = null;

            pdelegate += pm.CsharpProgramer;

            pdelegate += pm.CProgramer;

            pm.Description("杨友山", pdelegate);
Copier après la connexion

Ici, pm.CsharpProgramer est exécuté en premier, puis la méthode pm.CProgramer est exécutée. On peut voir que le délégué peut non seulement utiliser des méthodes comme paramètres, mais également lier des méthodes, et il peut lier plusieurs méthodes.

Utilisez = pour lier la méthode et utilisez -= pour annuler L'appel ci-dessus peut être modifié comme suit :



De cette façon, seul pm.CsharpProgramer;

            ProgramDescriptionDelegate pm = new ProgramDescriptionDelegate();

            YYS.CSharpStudy.Window.SDelegate.ProgramDescriptionDelegate.DescriptionDelegate

                pdelegate = null;

            pdelegate += pm.CsharpProgramer;

            pdelegate += pm.CProgramer;

            pdelegate -= pm.CProgramer;

            pm.Description("杨友山", pdelegate);
Copier après la connexion
Ce qui précède est le contenu de la compilation des connaissances de base C# Connaissances de base (20) Commission (1) Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal