0
votes

Suis-je en train d'utiliser c # délégués de manière utile?

Je fais un simple exercice en utilisant des délégués en C #. La prémisse de base est qu'elle effectue simplement des calculs comme l'ajout et la soustraction. XXX PRE>

Et j'ai créé un délégué qui appellera ces fonctions dans une autre classe. p> xxx pré>

La classe de mise en œuvre ressemble à ceci: p> xxx pré>

Qu'est-ce qui me déroule des délégués est pourquoi ne pas simplement faire ce qui suit ? P>

if (choice == 1)
{
    return Calculator.Add(number1,number2);
}


3 commentaires

Les délégués concernent des appels de fonctions limitées. Dites que vous avez un type, dites un travailleur qui fait une tâche. Le travailleur pourrait être défini avec un délégué comme l'une de ses variables membres et pourrait utiliser ce délégué, ne sachant pas quelle est la tâche réelle à exécuter, jusqu'à ce qu'elle soit liée et invoquée. Dans l'exemple présenté ci-dessus, un délégué est plutôt inutile, mais il vous montre comment les délégués fonctionnent (vous avez une variable CD et vous le liez à plusieurs méthodes différentes en fonction de la branche de l'exécution, puis exécutez il)


Un meilleur exemple est avec ASP.NET, les délégués sont largement utilisés. Si vous avez déjà utilisé ASP.NET, il utilise des actions de contrôleur pour gérer les demandes HTTP. ASP.NET ne sait pas quelle logique réelle vous souhaitez avoir lieu avec des demandes HTTP, mais cela prendra votre contrôleur et invoquera ses méthodes en tant que délégués afin de supprimer une grande partie du code spécifique HTTP afin que vous puissiez vous concentrer sur la construction de votre application. Sans se soucier des détails granulaires des transmissions HTTP.


@ user1538301 Je ne suis pas trop sûr que ASP.NET est un bon exemple, car les appelants des délégués ne connaissent pas le nom de la méthode, s'ils ne le faisaient pas, ils n'utiliseraient pas de délégué. Depuis le script des coulisses sait le nom de l'action du contrôleur, ASP.net effectue simplement une recherche unique de la méthode concrète pour appeler avant de la mettre en cache. C'est plus probablement un exemple de "reliure tardive" et .net réfléchissant que des délégués


3 Réponses :


4
votes

Les délégués sont des types. Types qui prennent une référence à une fonction, plutôt qu'une autre valeur.

Les délégués sont présents à la main des fonctions comme un argument à une autre fonction. Ou d'être utilisé comme type pour une classe générique - principalement des collections dans la pratique. Il y a l'un des beaucoup de remplaçants pour des pointeurs nus qui devaient être inventés, donc .NET pourrait vous protéger de devoir gérer des pointeurs nus.

Cependant, ils sont également un cas où la repulté s'est avérée mieux par une marge juste. Par exemple, il est très possible de remplacer un commutateur / boîtier avec un dictionnaire . Si je vous ai donné un "code> int pointeur dans natif c ++. Vous ne pouviez pas dire s'il s'agissait d'une seule variable que je maintiendrai par référence, le début d'une matrice ou une fonction qui retourne int. Avec tous ces remplaçants de pointeur, vous savez.

Pour ce cas particulier, ces fonctions eux-mêmes sont surchargées. Les délégués sont encore plus excédentaires. Cette fonction "performcalculation", des sons comme si elle devrait être la partie interpréation d'une entrée d'entrée d'une application de console, pas une fonction.

Cependant, il n'y a pas beaucoup de bons, des exemples non ambigieux pour l'utilisation des délégués. Afin d'apprendre que cela fonctionne de manière proplique d'accord. C'est souvent un cas où vous devez faire appel à un jugement entre un commutateur / un cas avec une opération et des délégués codés.

Cependant, les événements sont l'un des rares cas de caisse transparente pour les délégués que je peux penser. Si vous les apprenez pour rien d'autre, apprenez-les pour des événements.


0 commentaires

0
votes

J'ai créé une réplique démontrant un modèle de travail utilisant des délégués de base ( action S, un type de délégué intégré à la bibliothèque standard qui ne prend aucun paramètre et ne renvoie rien).

Vous pouvez vérifier ici .

ETA: l'utilisation la plus courante pour les délégués est une programmation asynchrone / filetée.

Les threads exigent que les délégués fonctionnent comme ils ne connaissent pas le code à exécuter à l'avance, ils le portent simplement comme paramètre dans le fil nouvellement créé de l'exécution, il serait autrement impossible de créer des threads (bien, sans plus faible - accès de niveau que c # fournit)

Consultez les documents MSDN sur le API enfilée

De même, dans la programmation asynchrone, vous aurez généralement besoin d'un rappel (qui serait un délégué en C #) afin de différer l'exécution du code jusqu'à ce que des conditions préexistantes soient remplies. (Une analyse par exemple, une alternative commune au threading qui utilise un seul thread pour exécuter plusieurs tâches "simultanément" étape par étape)


0 commentaires

0
votes

Une fois que vous pouvez utiliser code> délégué code> S dans votre exemple consiste à avoir un mappage de choix à Calculatordélégate code>, alors vous recherchez simplement le calcul souhaité et exécutez-le:

static List<CalculatorDelegate> ChoiceMap = new List<CalculatorDelegate> {
    (n1, n2) => n1+n2,
    (n1, n2) => n1-n2,
    (n1, n2) => n1*n2
};


0 commentaires