Les fonctions de rappel constituent une partie importante de la programmation Windows. Si vous avez une formation en programmation C ou C++, vous avez utilisé des rappels dans de nombreuses API Windows. Après avoir ajouté le mot-clé AddressOf à VB, les développeurs et les développeurs peuvent profiter des API autrefois restreintes. Les fonctions de rappel sont en fait des pointeurs vers des appels de méthode, également appelés pointeurs de fonction, qui constituent une fonctionnalité de programmation très puissante. .NET implémente le concept de pointeurs de fonction sous forme de délégués. Leur particularité est que, contrairement aux pointeurs de fonction C, les délégués .NET sont de type sécurisé. Cela montre que le pointeur de fonction en C n'est qu'un pointeur vers une unité de stockage. Nous ne pouvons pas dire vers quoi ce pointeur pointe réellement, encore moins vers les paramètres et les types de retour. Comme décrit dans ce chapitre, les délégués .NET fonctionnent comme une opération de type sécurisé. Ci-dessous, nous apprendrons comment .NET utilise les délégués comme moyen d'implémenter des événements.
1. Mandat
Lorsque vous souhaitez passer une méthode à une autre méthode, vous devez utiliser un délégué. Pour comprendre ce qu'ils signifient, jetez un œil au code suivant :
int i = int.Parse("99");
Nous sommes habitués à transmettre des données en tant que paramètres aux méthodes, comme le montre l'exemple ci-dessus. Donc, passer une autre méthode à une méthode semble un peu étrange. Parfois, l’opération effectuée par une méthode n’est pas effectuée sur les données, mais sur une autre méthode, plus compliquée. Nous ne savons pas ce qu'est la deuxième méthode au moment de la compilation. Cette information ne peut être obtenue qu'au moment de l'exécution, nous devons donc transmettre la deuxième méthode en tant que paramètre à la première méthode. Cela semble déroutant. Voici quelques exemples : Pour expliquer. :
1. Démarrez les threads ----- En C#, vous pouvez demander à l'ordinateur d'exécuter certaines nouvelles séquences d'exécution en parallèle. Cette séquence est appelée un thread. Utilisez la méthode Start() sur une instance de System.Threading.Thread accumulée pour démarrer l'exécution d'un thread. Si vous souhaitez demander à l'ordinateur de démarrer une nouvelle séquence d'exécution, vous devez indiquer où la séquence doit être exécutée. L'ordinateur doit recevoir les détails de la méthode pour démarrer l'exécution, c'est-à-dire que la méthode Thread.Start() doit prendre un paramètre qui définit la méthode à appeler par le thread.
2. Classes de bibliothèque générales------Il existe de nombreuses bibliothèques qui contiennent du code pour effectuer diverses tâches standard. Ces bibliothèques sont généralement autonomes. De cette façon, lors de l’écriture de la bibliothèque, vous saurez comment effectuer la tâche. Mais parfois, les tâches contiennent aussi des sous-tâches. Seul le code client utilisant la bibliothèque sait comment effectuer ces sous-tâches. Par exemple, écrivez une classe qui prend un tableau d’objets et les trie par ordre croissant. Cependant, une partie du processus de tri consiste à réutiliser deux objets du tableau, en les comparant pour voir lequel doit apparaître en premier. Si vous écriviez une classe qui devait être capable de trier n'importe quel tableau d'objets, vous ne pourriez pas indiquer à l'avance à l'ordinateur comment comparer les objets. Le code client qui gère les tableaux d'objets dans une classe doit également indiquer à la classe comment comparer les objets à trier. En d’autres termes, le code client doit transmettre certains détails à la classe qui rendront cela approprié.
3. Événements ------ informent généralement le code des événements qui se sont produits. La programmation GUI concerne principalement la gestion des événements. Lorsqu'un événement se produit, le runtime doit savoir quelle méthode doit être exécutée. Cela nécessite de transmettre la méthode qui gère l'heure comme paramètre du délégué. Ceux-ci seront discutés plus tard.
Précédemment, nous avons établi la règle selon laquelle les noms de méthodes sont parfois transmis comme arguments à d'autres méthodes. Il est nécessaire d'indiquer ci-dessous comment réaliser ce processus. Le moyen le plus simple consiste à passer le nom de la méthode en paramètre. Par exemple, dans l'exemple de thread précédent, supposons qu'un nouveau thread est démarré et qu'il existe une méthode appelée EntryPoint(), qui est l'endroit où le thread commence à s'exécuter.
void EntryPoint()
{
//fait ce que le nouveau thread doit faire
}
Vous pouvez également utiliser le code suivant pour démarrer l'exécution d'un nouveau thread :
Sujet NouveauThread = nouveau Fil();
Thread.Start(EntryPoint); //FAUX
En fait, il s'agit d'une manière très simple, qui est utilisée dans certains langages comme le C et le C++ (en C et C++, le paramètre EntryPoint est un pointeur de fonction).
Mais cette approche directe peut poser certains problèmes, tels que la sécurité des types. Lors de la programmation orientée objet, les méthodes existent rarement de manière isolée. Elles doivent généralement être associées à une instance de classe avant d'être appelées. Et cette méthode ne prend pas en compte cette problématique. Ainsi, le .NET Framework ne permet pas syntaxiquement cette approche directe. Si vous souhaitez transmettre une méthode, vous devez encapsuler les détails de la méthode dans un nouveau type d'objet, un délégué. Les délégués ne sont qu'un type spécial d'objet. La particularité est que tous les objets que nous avons définis précédemment contiennent des données, tandis que les délégués ne contiennent que les détails des méthodes.
-