Tutoriel C#SE CONNECTER
Tutoriel C#
auteur:php.cn  temps de mise à jour:2022-04-11 14:06:23

Délégué C#



Un délégué en C# est similaire à un pointeur vers une fonction en C ou C++. Delegate est une variable de type référence qui contient une référence à une méthode. Les références peuvent être modifiées au moment de l'exécution.

Delegate est notamment utilisé pour implémenter des événements et des méthodes de rappel. Tous les délégués (Delegate) sont dérivés de la classe System.Delegate.

Déclaration de délégation (Délégué)

Une déclaration de 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, supposons qu'il y ait un délégué :

public delegate int MyDelegate (string s);

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

La syntaxe pour déclarer un délégué est la suivante :

delegate <return type> <delegate-name> <parameter list>

Instancier un délégué (Delegate)

Une fois qu'un type délégué est déclaré, l'objet délégué doit utiliser le <🎜 Mot clé >new à créer et à associer à une méthode spécifique. Lors de la création d'un délégué, les paramètres passés à l'instruction new sont écrits comme un appel de méthode, mais sans paramètres. Par exemple :

public delegate void printString(string s);
...
printString ps1 = new printString(WriteToScreen);
printString ps2 = new printString(WriteToFile);

L'exemple suivant montre la déclaration, l'instanciation et l'utilisation d'un délégué, qui peut être utilisé pour référencer une méthode qui prend un paramètre entier et renvoie une valeur entière.

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         // 创建委托实例
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         // 使用委托对象调用方法
         nc1(25);
         Console.WriteLine("Value of Num: {0}", getNum());
         nc2(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Value of Num: 35
Value of Num: 175

Multidiffusion d'un délégué

L'objet délégué peut être utilisé avec l'opérateur "+" pour fusionner. Un délégué fusionné appelle les deux délégués qu’il fusionne. Seuls les délégués du même type peuvent être fusionnés. L'opérateur "-" peut être utilisé pour supprimer les délégués de composants des délégués fusionnés.

En utilisant cette fonctionnalité utile des délégués, vous pouvez créer une liste d'appels de méthodes à appeler lorsque le délégué est appelé. C'est ce qu'on appelle la

multidiffusion déléguée, également appelée multidiffusion. Le programme suivant démontre la multidiffusion des délégués :

using System;

delegate int NumberChanger(int n);
namespace DelegateAppl
{
   class TestDelegate
   {
      static int num = 10;
      public static int AddNum(int p)
      {
         num += p;
         return num;
      }

      public static int MultNum(int q)
      {
         num *= q;
         return num;
      }
      public static int getNum()
      {
         return num;
      }

      static void Main(string[] args)
      {
         // 创建委托实例
         NumberChanger nc;
         NumberChanger nc1 = new NumberChanger(AddNum);
         NumberChanger nc2 = new NumberChanger(MultNum);
         nc = nc1;
         nc += nc2;
         // 调用多播
         nc(5);
         Console.WriteLine("Value of Num: {0}", getNum());
         Console.ReadKey();
      }
   }
}

Lorsque le code ci-dessus est compilé et exécuté, il produit les résultats suivants :

Value of Num: 75

Objectif du délégué

L'exemple suivant démontre le recours à la délégation. Le délégué

printString peut être utilisé pour référencer une méthode qui prend une chaîne en entrée et ne renvoie rien.

Nous utilisons ce délégué pour appeler deux méthodes, la première imprime la chaîne sur la console, la seconde imprime la chaîne dans le fichier :

using System;
using System.IO;

namespace DelegateAppl
{
   class PrintString
   {
      static FileStream fs;
      static StreamWriter sw;
      // 委托声明
      public delegate void printString(string s);

      // 该方法打印到控制台
      public static void WriteToScreen(string str)
      {
         Console.WriteLine("The String is: {0}", str);
      }
      // 该方法打印到文件
      public static void WriteToFile(string s)
      {
         fs = new FileStream("c:\message.txt",
         FileMode.Append, FileAccess.Write);
         sw = new StreamWriter(fs);
         sw.WriteLine(s);
         sw.Flush();
         sw.Close();
         fs.Close();
      }
      // 该方法把委托作为参数,并使用它调用方法
      public static void sendString(printString ps)
      {
         ps("Hello World");
      }
      static void Main(string[] args)
      {
         printString ps1 = new printString(WriteToScreen);
         printString ps2 = new printString(WriteToFile);
         sendString(ps1);
         sendString(ps2);
         Console.ReadKey();
      }
   }
}

Lorsque le code ci-dessus est compilé et lorsqu'il est exécuté, il produit les résultats suivants :

The String is: Hello World