7
votes

Utilisation d'Action comme argument en C # (imiter un pointeur de fonction)

J'ai besoin d'écrire une fonction de déléguée qui peut "envelopper" certains tandis que / essayer / attraper du code autour d'un appel de base UDP pour vérifier le lien. Je l'ai fait fonctionner pour Func pour une fonction qui n'a aucun argument, mais je ne peux pas le faire travailler pour une action, qui a un argument (mais pas de retour). Je ne peux pas sembler passer dans l'argument de manière logique sans le compilateur qui se plaint.

Est-ce que je vais tout cela mal? Je suis nouveau à C # et j'essaie essentiellement d'immerger l'idée d'un pointeur de la fonction. Devrais-je ne pas surcharger cette fonction? Je sais que vous ne pouvez pas surcharger des délégués (je suppose que c'est pourquoi la fonction de fonctionnement et d'action). P>

Ceci fonctionne: P>

udpCommand<uint>(someUdpCommand);


2 commentaires

Supplémentaire - vous n'avez pas vraiment besoin du t; Vous pouvez simplement prendre action (non argone) et appeler comme: udpcommand ((() => SOMEMETHOD (123));


Cela me permettrait-il d'avoir un nombre varié de paramètres d'entrée à UDPCOMMAND sans surcharger, disons, jusqu'à 4 paramètres? C'est ce que je dois faire. Aurais-je encore besoin d'une fonction de fonctionnement et d'une action?


4 Réponses :


2
votes

Je pense que vous avez juste besoin de sortir la (T-valeur) après la "commande".


3 commentaires

Le compilateur se plaint avec ou sans le T.


HMMM Je pense que parce que la question était un peu ambiguë, mais j'aurais dû réaliser que vous essayiez de transmettre l'argument à l'action. Je suis d'accord avec la solution fournie dans votre réponse acceptée, qui passe simplement une valeur T également (bien que non entre parenthèses). Si vous aviez "valeur" disponible dans le bloc du code, je pense que cela aurait fonctionné ok.


Ah, oui, je crois que cela fonctionnerait aussi. Merci pour les commentaires.



4
votes

Voulez-vous dire: xxx

avec appelant: xxx

Notez que cela peut mieux fonctionner sur C # 3.0, qui peut fonctionner plus générique. Type Inference que c # 2.0.


1 commentaires

Aha! Celui-ci semble fonctionner ... au moins le compilateur ne se plaignait plus. Les exemples de Microsoft ne couvrent pas vraiment mon cas d'utilisation. Heureusement j'utilise c # 3.0. Le kilométrage peut varier sur C # 2.0.



0
votes

essayez-vous de faire cela ... xxx

alors cela fonctionnerait comme ceci ... xxx


0 commentaires

12
votes

Si vous voulez que cela soit suffisamment générique pour gérer un nombre quelconque d'arguments, essayez d'utiliser le délégué d'action non-genernique: xxx

en C # 3.0, vous pouvez l'appeler comme ceci: < / p> xxx

in c # 2.0 C'est un peu plus laid: xxx

ceci vous donne une exécution différée sans vous enfermer dans une signature de méthode particulière .

EDIT

Je remarque que j'ai un peu volé le commentaire de Marc Gravell ... excuses marc. Pour répondre à la manière dont vous pourriez réduire votre duplication, vous pouvez avoir la méthode action appelez la méthode func , comme ceci: xxx

Je crois (et je me tromperais peut-être) que le retour de 0 n'est pas plus coûteux que (implicitement) de retourner non vides, mais je peux être un chemin ici. Même cela a un coût, cela ne mettrait qu'un minuscule notty snoodge supplémentaire sur la pile. Dans la plupart des cas, le coût supplémentaire ne vous causera jamais de chagrin.


1 commentaires

J'adore cet endroit. Juste ce dont j'avais besoin comme une recrue C # / vs.net. Merci.