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: p> lorsque vous pouvez faire: p> Les deux compileront et travailler dans mon expérience ... je manque quelque chose? p> p>
3 Réponses :
Tant que le groupe de méthodes 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> 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.
class MyObject {
public void SomeMethod() { }
}
MyObject someObject = new MyObject();
Est someobject.somemethod () code> aussi un groupe de méthodes?
@John Feminella: Non, ce serait une invocation de méthode.
Hmm d'accord. Et si SOMEMETHOD code> avait plusieurs surcharges dont la signature correspondant
SOMEMETHOD (...) code>, où
... code> 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) code> où chacun des
paramètrej code> est une expression,
Référence variable de référence code> ou
Référence de variable code>? 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) CODE> 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 code>. 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.
C'est équivalent. Bon article d'introduction sur le sujet: C # délégués, méthodes anonymes et expressions Lambda - O Mon! P>
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. P>