10
votes

C # Déléguer l'instanciation vs dépasser la référence de la méthode

J'ai une question simple: quel est l'avantage de l'instanciation d'un délégué C # par opposition à juste passer la référence de fonction? Ce que je veux dire, c'est:

pourquoi faire: xxx

lorsque vous pouvez faire: xxx

Les deux compileront et travailler dans mon expérience ... je manque quelque chose?


0 commentaires

3 Réponses :


6
votes

Tant que le groupe de méthodes SomeObject.Somemethod code> a une méthode avec le type de retour vide code> et ne prend aucun paramètre il n'y a pas de différence. Ceci est parce que threadstart code> est défini comme un délégué code> qui renvoie vide code> et ne prend aucun paramètre et il y a donc une conversion implicite du groupe de méthodes SomeObject.Somemethod code> à threadstart code>. Ainsi, les deux invoquent la surcharge thread ( Threadstart) code> du fichier code> constructeur.

La section correspondante de la spécification de langue est §6.6 (conversions de groupe de méthodes). P>

J'ai une question simple: quel est l'avantage de l'instanciation d'un délégué C # par opposition à juste passer la référence de fonction? p> BlockQuote>

Donc, juste une correction de la terminologie ici. Avec P>

class MyObject {
    public void SomeMethod() { }
}

MyObject someObject = new MyObject();


6 commentaires

Est someobject.somemethod () aussi un groupe de méthodes?


@John Feminella: Non, ce serait une invocation de méthode.


Hmm d'accord. Et si SOMEMETHOD avait plusieurs surcharges dont la signature correspondant SOMEMETHOD (...) , où ... sont des paramètres arbitraires? Est-ce un groupe de méthodes alors, puisqu'il pourrait faire référence à l'une des méthodes et n'a pas encore été résolue?


@John Feminella: Désolé, votre question n'est pas claire pour moi. Demandez-vous d'une expression d'invocation? Par exemple, quelqueoObject.somemethod (paramètre1, paramètre2, ..., paramètre) où chacun des paramètrej est une expression, Référence variable de référence ou Référence de variable ? Pour une telle expression, il existe une surcharge optimale (§7.4.3 de la spécification), une tentative est faite pour traiter l'expression en tant qu'invocation de méthode d'extension ou une erreur de compilation de compilation se produit; Pour être clair: les invocations ambiguës sont des erreurs de compilation. Est-ce ce que vous demandez?


Je suis peut-être mal compris que c'est un groupe de méthodes. Je vais hors de votre dernière phrase, qui dit que c'est "l'ensemble de méthodes surchargées pouvant être levées en utilisant la notation ...". Si j'écris SOMEMETHOD (A, B) et que plusieurs surcharges peuvent correspondre à ces arguments (même si on est finalement résolu à être la bonne via les règles de résolution de surcharge), est-ce qu'un groupe de méthodes ?


@John Feminella: Non Ce n'est pas un groupe de méthodes, c'est une invocation de méthode. Notez que dans ma phrase que vous vous référez à il n'y a pas de parenthèses, etc. Dans l'expression ToOObject.Somemethod . Une fois que les parenthèses et les paramètres sont lancés dans l'expression deviennent une expression d'appel légale ou une erreur de compilation de compilation se produit.



0
votes

C'est équivalent. Bon article d'introduction sur le sujet: C # délégués, méthodes anonymes et expressions Lambda - O Mon!


0 commentaires

4
votes

Le compilateur déduira que lorsque vous avez tapé le code plus court, vous vouliez dire le code plus long. Il n'y a pas de différence dans l'effet ultime. Si vous voulez la clarté du constructeur complet, vous pouvez le mettre dans; Si vous souhaitez la brièveté du groupe de méthodes, vous pouvez permettre au compilateur d'inférer le constructeur. C'est juste un choix stylistique.


0 commentaires