web-dev-qa-db-fra.com

Qu'est-ce qu'un groupe de méthodes en C #?

J'ai souvent rencontré une erreur telle que "impossible de convertir de 'groupe de méthodes' en 'chaîne'" dans les cas suivants:

var list = new List<string>();
// ... snip
list.Add(someObject.ToString);

bien sûr, il y avait une faute de frappe dans la dernière ligne car j'avais oublié les parenthèses d'invocation après ToString. La forme correcte serait:

var list = new List<string>();
// ... snip
list.Add(someObject.ToString()); // <- notice the parentheses

Cependant, je me suis demandé ce qu'est un groupe de méthodes. Google n'est pas très utile ni MSDN .

332
Andrei Rînea

Un groupe de méthodes est le nom d’un ensemble de méthodes (qui pourrait n’en être qu’un) - c’est-à-dire que la méthode ToString peut avoir plusieurs surcharges (plus les méthodes d’extension): ToString(), ToString(string format), etc - d’où ToString est en soi un "groupe de méthodes".

Il peut généralement convertir un groupe de méthodes en un délégué (typé) à l'aide de la résolution de surcharge - mais pas en une chaîne, etc. ça n'a pas de sens.

Une fois que vous ajoutez des parenthèses, encore une fois; la résolution de surcharge commence et vous avez identifié sans ambiguïté un appel de méthode.

307
Marc Gravell

De plus, si vous utilisez LINQ, vous pouvez apparemment faire quelque chose comme myList.Select(methodGroup).

Donc, par exemple, j'ai:

private string DoSomethingToMyString(string input)
{
    // blah
}

Au lieu d’indiquer explicitement la variable à utiliser comme ceci:

public List<string> GetStringStuff()
{
    return something.getStringsFromSomewhere.Select(str => DoSomethingToMyString(str));
}

Je peux juste omettre le nom du var:

public List<string> GetStringStuff()
{
    return something.getStringsFromSomewhere.Select(DoSomethingToMyString);
}
154
Kaeles

Vous pouvez convertir un groupe de méthodes en un délégué.

La signature du délégué sélectionne 1 méthode sur le groupe.

Cet exemple sélectionne la surcharge ToString() qui prend un paramètre de chaîne:

Func<string,string> fn = 123.ToString;
Console.WriteLine(fn("00000000"));

Cet exemple sélectionne la surcharge ToString() qui ne prend aucun paramètre:

Func<string> fn = 123.ToString;
Console.WriteLine(fn());
20
Jack

Le premier résultat de votre recherche MSDN disait:

Le groupe de méthodes identifie la méthode à invoquer ou l’ensemble des méthodes surchargées à partir desquelles choisir une méthode spécifique à invoquer.

si j'ai bien compris, lorsque vous écrivez simplement someInteger.ToString, vous pouvez vous référer à:

Int32.ToString(IFormatProvider) 

ou il peut se référer à:

Int32.ToString()

c'est ce qu'on appelle un groupe de méthodes.

18
oscarkuo

La fonction ToString comporte de nombreuses surcharges - le groupe de méthodes serait le groupe constitué de toutes les surcharges différentes pour cette fonction.

17
1800 INFORMATION