2010-02-02 4 views
9

J'ai une question simple: quel est l'avantage d'instancier un délégué C# par opposition à simplement passer la référence de la fonction? Ce que je veux dire est:Instance de délégué C# vs passage juste de la méthode Référence

Pourquoi:

Thread t = new Thread(new ThreadStart(SomeObject.SomeMethod)); 

Quand vous pouvez faire:

Thread t = new Thread(SomeObject.SomeMethod); 

Les deux compilera et travailler dans mon expérience ... suis-je manque quelque chose?

+0

duplication possible de [Quelle est la différence entre une nouvelle action() et un lambda?] (Http://stackoverflow.com/questions/765966/what-is-the-difference-between-new-action-and- a-lambda) – nawfal

Répondre

6

Tant que le groupe de méthodes SomeObject.SomeMethod a une méthode avec le type de retour void et ne prend aucun paramètre, il n'y a pas de différence. Cela est dû au fait que ThreadStart est défini comme delegate qui renvoie void et ne prend aucun paramètre. Par conséquent, il existe une conversion implicite du groupe de méthodes SomeObject.SomeMethod en ThreadStart. Ainsi, les deux appellent la surcharge Thread(ThreadStart) du constructeur Thread.

La section pertinente de la spécification de langage est §6.6 (Conversions de groupes de méthodes).

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

Donc, juste une correction de la terminologie ici. Avec

class MyObject { 
    public void SomeMethod() { } 
} 

MyObject someObject = new MyObject(); 

la chose notée par someObject.SomeMethod est un groupe de méthode. Vous pouvez juste penser à cela comme l'ensemble des méthodes surchargées peut être recherché en utilisant la notation someObject.SomeMethod.

+1

'someObject.SomeMethod()' est-il également un groupe de méthodes? –

+1

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

+0

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

4

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

Questions connexes