Maison  >  Article  >  développement back-end  >  Journal d'apprentissage C# 19 ---- Type de référence de type de délégué (délégué)

Journal d'apprentissage C# 19 ---- Type de référence de type de délégué (délégué)

黄舟
黄舟original
2017-01-21 15:11:481666parcourir

La signification du type délégué a été introduite dans la préface des types de référence (cliquez pour voir). En bref, un délégué est une classe qui définit des méthodes. Le type permet de passer la méthode en paramètre d'une autre méthode. . Pour parler franchement, la méthode peut être passée en paramètre. Tous les délégués (Delegate) sont dérivés de la classe System.Delegate.

(Je n'ai pas l'air de comprendre) Utilisons une analogie. Roommate HC555 est un passionné de LoL et aime faire du shopping sur Taobao Lorsqu'il était immergé dans LoL, le coursier l'a appelé pour le récupérer Express. livraison, la chose la plus ennuyeuse dans les jeux est la suivante, alors il m'a demandé de reprendre la livraison express pour lui. À ce moment-là, nous considérons le colocataire comme la classe (ami de chambre), et prendre la livraison express est une méthode dans le. class (takepackage()), et je suis un objet instancié par Delegate (un objet qui peut transporter des méthodes), "portant" la méthode de récupération de la livraison express chez mon colocataire.

Déclaration d'un délégué :

La déclaration d'un délégué détermine les méthodes qui peuvent être référencées par le délégué. Un délégué peut pointer vers une méthode portant le même label que lui.

Par exemple, déclarez un délégué :

    public delegate int MyDelegate(string str); //string类型的变量就是它的标签

Le délégué ci-dessus peut être utilisé pour référencer n'importe quelle méthode qui prend un seul paramètre de chaîne et renvoie une variable de type int.

Instancier un délégué :

Le délégué est le type de la méthode Une fois le type délégué déclaré, l'objet délégué doit être créé en utilisant le nouveau. mot-clé et doit être créé avec le nouveau mot-clé lié à une méthode spécifique. Lors de la création d'un délégué, les méthodes sont transmises à la nouvelle instruction sous forme de variables, mais sans paramètres. Par exemple :

  public delegate int MyDelegate(string str);  //委托的声明
           .....   
           public static int Add(string s);   //定义的一个方法
         .....   
         MyDelegate my = new MyDelegate(Add) ;  //实例化一个委托,其实就是实例化一个对象

Exemple de code :

Revenons à l'histoire du retrait de la livraison express, on convertit cette histoire en code :

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test  
{   
    public delegate void MyDelegate(string str);    //委托的声明  
  
    class roomfriend  //定义室友这个类  
    {   
        public static void takepackage(string name)  //定义一个取快递的方法  
        {  
           Console.WriteLine("我叫 {0} 这是一个取快递方法",name);  
            
        }  
    }  
    class program  
    {  
        static void Main(string[] args)  
        {  
            MyDelegate myd = new MyDelegate(roomfriend.takepackage); //实例化一个委托“我”携带一个方法(将方法当参数传入)  
            myd("HC555");   //由我实现室友的方法,实际是室友的方法当参数传给了我  
        }  
    }  
}

Le résultat est le suivant :


Journal dapprentissage C# 19 ---- Type de référence de type de délégué (délégué)

Quand je suis revenu au dortoir après avoir récupéré la livraison express, ma colocataire m'a appelé et a dit qu'il avait faim et m'a demandé d'acheter quelque chose à manger en passant devant le supermarché. Dans l'esprit de Lei Feng, j'ai accepté... "Acheter quelque chose" ici peut aussi être vu comme une méthode dans roomfriend, et "je" aussi "porter" Il y a une méthode de sa part. En C#, utilisez "=" pour connecter les méthodes de fusion dans l'ordre et les afficher dans l'ordre lorsqu'elles sont appelées ; L'avez-vous récupéré par livraison express... 0.0)

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test  
{   
    public delegate void MyDelegate(string str);    //委托的声明  
  
    class roomfriend  //定义室友这个类  
    {   
        public static void takepackage(string name)  //定义一个取快递的方法  
        {  
           Console.WriteLine("我叫 {0} 这是一个取快递方法",name);  
            
        }  
        public static void shopping(string name)   //定义一个买东西的方法  
        {  
            Console.WriteLine("我叫 {0}  这是一个买东西的方法",name);  
        }  
      
    }  
    class program  
    {  
        static void Main(string[] args)  
        {  
            MyDelegate myd = new MyDelegate(roomfriend.takepackage); //实例化一个委托“我”携带一个方法(将方法当参数传入)  
            
            myd += roomfriend.shopping;    // += 合并运算顺序执行方法   
            myd("HC555");  
        }  
    }  
}
Dans ce qui précède ? nous utilisons "=" pour connecter des méthodes. Lorsque nous voulons annuler une méthode, nous pouvons naturellement utiliser "-=" pour annuler la connexion avec "I". Portez la relation, donc dans le code ci-dessus, nous n'avons besoin que d'ajouter myd -=. roomfriend.takepackage // mettez-le ci-dessous = pour que la méthode de prise express ne soit plus appelée.

Journal dapprentissage C# 19 ---- Type de référence de type de délégué (délégué) J'ai acheté quelques boîtes de biscuits au supermarché et mon téléphone a encore sonné. C'était encore mon colocataire. Il m'a dit que le colis était pour sa copine et m'a demandé de le livrer. à lui. Dans le passé, les bonnes personnes s'y tenaient, et j'ai accepté. . Alors qu'elle livrait un coursier à sa petite amie, elle était pressée et s'est donc empressée de m'emporter toutes mes affaires, y compris les boîtes de biscuits. . Puis j'ai ri et je suis retourné au dortoir joyeusement... Ici, nous définissons une autre classe (petite amie), qui a une méthode d'acceptation (accepter), et je (délégué) est utilisé comme paramètre de la méthode

Méthode de définition : public static void accept(string name,MyDelegate pack) ; Si vous considérez un délégué comme une boîte, alors cette boîte regorge de méthodes avec le même type de paramètres. Nous comparons MyDelegate pack avec string name est une variable de type chaîne, et pack peut être considéré comme une variable de type MyDelegate.

Le résultat est le même

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
  
namespace Test  
{   
    public delegate void MyDelegate(string str);    //委托的声明  
  
    class roomfriend  //定义室友这个类  
    {   
        public static void takepackage(string name)  //定义一个取快递的方法  
        {  
           Console.WriteLine("我叫 {0} 这是一个取快递方法",name);  
            
        }  
        public static void shopping(string name)   //定义一个买东西的方法  
        {  
            Console.WriteLine("我叫 {0}  这是一个买东西的方法",name);  
        }  
      
    }  
    class girlfriend  //定义一个girlfriend 类  
    {  
        public static void accept(string name,MyDelegate package) //定义一个accept方法 将委托作为参数传入     
          {  
        package(name);  
    }  
}  
class program  
{  
    static void Main(string[] args)  
    {  
        MyDelegate myd = new MyDelegate(roomfriend.takepackage); //实例化一个委托“我”携带一个方法(将方法当参数传入)  
        
        myd += roomfriend.shopping;    // += 合并运算顺序执行方法   
  
        girlfriend.accept("HC555", myd);  
    }  
}
Réflexion :

Dans l'exemple que j'ai donné ci-dessus, "colocataire" ou "petite amie du colocataire" est considéré comme une classe. Lorsque j'appelle la méthode, j'utilise le nom du type. Si j'utilise un objet instancié, je passe le nom de l'objet. . Méthode de référence du nom de la méthode à transmettre au délégué :

roomfriend myfriend = new roomfriend(); // Instancier le colocataire dans un objet

MyDelegate myd = new MyDelegate(myfriend.tackpackage ; Il s'avère que même si j'ai déclaré takepackage comme accès public dans le code, il sera toujours compilé dans un champ privé. Ceci est lié à la statique que nous avons utilisée lors de la définition de la méthode (nous y reviendrons plus tard). peut être C'est fait ;

Ce qui précède est le contenu du C# Learning Diary 19----Type de référence Delegate (Delegate) Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www. php.cn) !

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