[Série de connaissances de base C #] Sujet 1: Analyse approfondie de la délégation - Pourquoi la délégation est-elle introduite en C #

Présentation:

Certains amis qui sont nouveaux en C # peuvent ne pas avoir une compréhension approfondie de certaines fonctionnalités de base en C #. Cependant, cette connaissance est également une question souvent posée par les enquêteurs lors des entretiens, donc je pense qu'il est nécessaire de partager avec certains amis qui sont proches de C #. Article suivant sur les connaissances de base de C #, donc avec cette série, j'espère qu'à travers cette série, les amis pourront mieux comprendre les connaissances de base de C #. Cependant, la délégation est également un point plus important dans les connaissances de base de C #. Fondamentalement, les fonctionnalités suivantes sont quelque peu liées à la délégation, donc ici je vais parler de délégation d'abord, pourquoi devons-nous déléguer.

1. Qu'est-ce que la délégation C #?

Avant de présenter officiellement la délégation, je voudrais examiner l’exemple de la délégation dans la vie de tous les jours.Si nous devons poursuivre, l’avocat nous défendra devant le tribunal, mais il exécute vraiment la déclaration du parti. À ce moment, l'avocat est un client, et le client confie à l'avocat de se défendre. C'est l'exemple de la délégation dans nos vies. Cependant, le concept de délégation en C # est comme un objet avocat (d'où l'on peut conclure que la délégation est une classe, car seules les classes ont le concept d'objets, ce qui reflète également que C # est un langage orienté objet).

Après avoir présenté ce qu'est la délégation dans la vie, examinons comment la délégation en C # est liée aux objets de la vie. La délégation en C # est équivalente à un pointeur de fonction en C ++ (si vous avez déjà appris le C ++, vous savez ce qu'est un pointeur de fonction. Conceptuel), le pointeur de fonction consiste à utiliser un pointeur pour obtenir l'adresse d'entrée d'une fonction, puis à utiliser ce pointeur pour implémenter le fonctionnement de la fonction. Le délégué en C # est équivalent au pointeur de fonction en C ++, ce qui signifie que les deux sont différents: le délégué est orienté objet, sûr pour le type et est un type de référence (on dit que le délégué est une classe depuis le début), donc lors de l'utilisation du délégué La première chose à définir est-> déclaration-> instanciation-> passée en paramètre à la méthode-> délégation d'utilisation. Examinons de plus près comment utiliser les délégués:

1. Définition: délégué nul Mydelegate (type1 para1, type2 para2);

2. Déclaration: Mydelegate d;

Trois, instanciation: d = new Mydelegate (obj.InstanceMethod); (passez une méthode au constructeur du délégué), les trois premières étapes sont comme construire un objet avocat, la méthode InstanceMethod est comme une partie

Quatre, transmis en tant que paramètre à la méthode: MyMethod (d); (l'implémentation déléguée transmet la méthode en tant que paramètre à une autre méthode, et le délégué est un objet qui enveloppe la méthode)

5. Utilisez la délégation dans la méthode. La méthode MyMethod est comme un juge. La méthode MyMethod appelle d'abord le délégué, et le délégué appelle la méthode InstanceMethod. Ce processus est comme le juge posant une question à l'avocat, puis l'avocat doit connaître le cas devant le client. La mise en service C # est comme un avocat, qui dit vraiment que l'affaire est la partie (vraiment appelée la méthode d'instance InstanceMethod)

La définition de la méthode MyMethod est la suivante:

Copier le code
private  void MyMethod (Mydelegate mydelegate) 

{ 
    // Utiliser délégué 
    mydelegat (arg1, arg2); 

}
Copier le code

Deuxièmement, pourquoi utiliser des délégués en C #?
Je crois qu'après l'introduction ci-dessus, tout le monde ne devrait pas être étranger à la délégation, mais pourquoi devons-nous déléguer, pourquoi devrions-nous instancier cet objet au milieu, et pourquoi ne pas appeler la méthode InstanceMethod directement dans la méthode MyMethod, donc ce n'est pas une recherche de soi Est-ce gênant? Pour que tout le monde comprenne mieux pourquoi la délégation est utilisée, ce qui suit utilise un programme "Text scribe" de Windows Form pour expliquer pourquoi.

La fonction du programme est la suivante: entrez du texte dans la zone de texte inférieure, cochez la case "zone de texte 1" ou "zone de texte 2" dans la zone de liste déroulante "écrire dans", puis cliquez sur le bouton "démarrer", le programme placera automatiquement la zone de texte Le texte dans "transcrire" dans la zone de texte correspondante. L'interface du programme est la suivante:

 Le code d'implémentation traditionnel est:

Copier le code
espace de noms scribe 
{ 
    public  partial  class Form1: Form 
    { 
        public Form1 () 
        { 
            InitializeComponent (); 
        } 

        private  void button1_Click ( object sender, EventArgs e) 
        { 
            if (checkBox1.Checked == true ) 
            { 
                textBox1.Clear (); 
                textBox1 .Refresh (); 
                // Appelez la méthode WriteRichTextBox1 pour écrire du texte dans la zone de texte 1 
                this .WriteTextBox1 (); 
                textBox3.Focus (); 
                textBox3.SelectAll ();
            }
             if (checkBox2.Checked == true ) 
            { 
                textBox2.Clear (); 
                textBox2.Refresh (); 
                // Appelez la méthode WriteRichTextBox2 pour écrire du texte dans la zone de texte 2 
                this .WriteTextBox2 (); 
                textBox3.Focus (); 
                textBox3.SelectAll ( ); 
            } 
        } 

        private  void WriteTextBox1 () 
        { 
            string data = textBox3.Text;
             for ( int i = 0 ; i <data.Length; i ++ ) 
            {
                textBox1.AppendText (data [i] .ToString ()); 
                // retard intermittent
                DateTime now = DateTime.Now;
                while (now.AddSeconds ( 1 )> DateTime.Now) 
                {} 
            } 
        } 

        private  void WriteTextBox2 () 
        { 
            string data = textBox3.Text;
            for ( int i = 0 ; i <data.Length; i ++ ) 
            { 
                textBox2.AppendText (data [i] .ToString ()); 
                // 间歇 延时 
                DateTime now = DateTime.Now;
                while (now.AddSeconds ( 1 )> DateTime.Now) 
                {} 
            } 
        } 
    } 
}
Copier le code

Cependant, nous verrons à partir du code que la méthode WriteTextBox1 () et WriteTextBox2 () n'ont qu'une seule ligne de code différente (textBox1.AppendText (data [i] .ToString ()); et textBox2.AppendText (data [i] .ToString ()) ;), Les autres sont exactement les mêmes, et la différence entre cette déclaration est que l'objet de contrôle dans lequel le texte est écrit n'est pas le même, l'un est TextBox1 et TextBox2, et maintenant ce code est pour réaliser la fonction, pensons au ruban, si nous voulons réaliser Il y a plus de deux zones de texte écrites, mais des dizaines ou plus, va donc bientôt écrire le même nombre de méthodes pour écrire des zones de texte? De cette façon, vous devez écrire du code répété, ce qui conduit à une mauvaise lisibilité du code. L'écriture de code est également une méthode de programmation orientée processus . Parce que la fonction est une encapsulation du processus d'exploitation, pour résoudre ce problème, nous pensons naturellement à faire face à objet programmation, alors nous allons penser à la modification partie du paquet ensemble, les paramètres de la méthode alors objet encapsulé passé comme un objet donné (cette idée est un modèle de conception - modèle de stratégie, design patterns série sera Comme indiqué plus loin ), les éléments suivants utilisent le délégué pour réimplémenter ce programme:

Copier le code
espace de noms scribe 
{ 
    public  partial  class Form1: Form 
    { 
        // define the delegate 
        private  delegate  void WriteTextBox ( char ch);
         // declare the delegate 
        private WriteTextBox writeTextBox; 

        public Form1 () 
        { 
            InitializeComponent (); 
        } 

        private  void button1_Click ( object sender , expéditeur d' 
            objet , EventArgs e) 
        { if (checkBox1.Checked == true ) 
            { 
                textBox1.Clear ();
                textBox1.Refresh (); 
                // Instanciation du délégué 
                writeTextBox = new WriteTextBox (WriteTextBox1);
                 // En tant que paramètre 
                WriteText (writeTextBox); 

                textBox3.Focus (); 
                textBox3.SelectAll (); 
            } 
            if (checkBox2.Checked == true ) 
            { 
                textBox2.Clear (); 
                textBox2.Refresh (); 
                // Instancier délégué 
                writeTextBox = new WriteTextBox (WriteTextBox2);
                 // En tant que paramètre 
                WriteText (writeTextBox);

                textBox3.Focus (); 
                textBox3.SelectAll (); 
            } 
        } 


         
            }private  void WriteText (WriteTextBox writetextbox) 
        { 
            string data = textBox3.Text;
            for ( int i = 0 ; i <data.Length; i ++ ) 
            { 
                // 使用 委托
                writetextbox (data [i]); 
                DateTime now = DateTime.Now;
                while (now.AddSeconds ( 1 )> DateTime.Now) 
                {} 
        } 

        private  void WriteTextBox1 ( char ch) 
        { 
            textBox1.AppendText (ch.ToString ()); 
        } 
        private  void WriteTextBox2 ( char ch) 
        { 
            textBox2.AppendText (ch.ToString ()); 
        } 
    } 
}
Copier le code

En introduisant le code implémenté après la mise en service, nous utilisons la méthode WriteText pour écrire du contenu dans la zone de texte. Ce qu'il fait, c'est effectuer une opération abstraite d '"écriture de texte". Comme pour l'écriture de texte dans cette zone de texte, pour les programmes qui écrivent des méthodes WriteText, Je ne sais pas. La délégation de writeTextBox est comme une interface (un principe très important dans les principes de conception orientée objet est-pour la programmation d'interface, pas pour la programmation d'implémentation), protégeant la différence des objets d'exploitation (la méthode est d'écrire du texte Écrire du texte dans la zone 1, c'est toujours comme écrire du texte dans la zone de texte 2. Maintenant, je n'ai plus besoin de faire attention à ma méthode, je dois seulement me concentrer sur la mise en œuvre de l'opération "d'écriture de texte" sans avoir à se soucier du choix de l'objet d'exploitation).

3. Quel est le rôle de la délégation? ——Déclaration sommaire de la Commission

Je crois qu'à travers les deux parties ci-dessus, tout le monde comprend également ce qu'est la délégation et pourquoi le concept de délégation est introduit en C #. Résumons maintenant le rôle de la commission après l'introduction de la délégation? Il peut être constaté à partir du code délégué ci-dessus qu'après l'introduction du délégué, le programmeur peut encapsuler la référence de méthode dans l'objet délégué (transformer l'appel de la procédure en appel de l'objet, qui incarne pleinement l'idée que le délégué renforce la programmation orientée objet.), Ensuite, passez l'objet délégué au code qui doit faire référence à la méthode, afin que nous ne sachions pas quelle méthode a été appelée pendant le processus de compilation. De cette façon, après l'introduction du mécanisme délégué en C #, la séparation de la déclaration de méthode et de l'implémentation de la méthode reflète pleinement l'orientation Idées de programmation d'objets.

Résumé commandé de lui-même:

Je suis une classe spéciale , je définis le type de méthode, (tout comme int définit un type numérique, lorsqu'une méthode est utilisée pour instancier l'objet délégué, le délégué représente une méthode, le type de cette méthode est le type délégué), Je peux passer la méthode comme paramètre d'une autre méthode pour rendre le programme plus facile à développer

 

4. Résumé

Le contenu de cette introduction au sujet écrit ici est également terminé. À certains endroits de ce sujet, une certaine connaissance des modèles de conception est mentionnée. Si un ami n'a pas commencé à étudier les modèles de conception, je suggère à tout le monde de l'apprendre, et moi aussi Je partagerai ma compréhension avec vous dans la série suivante. Pour le sujet suivant de cette série, je partagerai avec vous le concept de l'événement. Enfin, j'espère que ce sujet vous permettra de mieux comprendre la commission.

 

http://www.cnblogs.com/zhili/archive/2012/10/22/Delegate.html

Publié 28 articles originaux · J'aime 15 · Visites 110 000+

Je suppose que tu aimes

Origine blog.csdn.net/z3h0a5n8g8x9i9a2o3/article/details/8603561
conseillé
Classement