web-dev-qa-db-fra.com

Définition d'une signature de méthode?

Quelle est la définition correcte d'une signature de méthode (ou d'une signature de méthode)?

Sur google, je trouve différentes définitions:

C'est la combinaison du nom de la méthode et de la liste des paramètres

Est-ce que cela signifie method signature = method name + argument list? Ensuite, je ne vois pas de différence entre " méthode " et " méthode signature ".

Si j'ai une méthode:

public void Foo(int x, int y) { ... }

Est-ce que ma signature de méthode serait l'une des suivantes ou aucune?

  • Foo
  • Foo (int, int)
  • Foo (int x, int y)
  • Foo (34, 78)

Comment suis-je supposé répondre si quelqu'un me demande quelle est la signature de méthode de la méthode?

23
KMC

Il existe un certain nombre de réponses correctes qui définissent la signature de la méthode comme étant le nom de la méthode, l’arité générique, l’arité du paramètre formel et les types et types de paramètres formels, mais pas le type de retour ou le modificateur "params".

Bien que cela soit correct, il y a quelques subtilités ici. La façon dont le langage C # définit la signature de méthode diffère de celle utilisée par CLR et peut entraîner des problèmes intéressants lors de l'interopérabilité entre C # et d'autres langages.

Pour le CLR, une signature de méthode comprend le nom de la méthode, l'arité générique, l'arité du paramètre formel, les types et types de paramètres formels et le type de retour. Donc, il y a la première différence; le CLR considère le type de retour.

Le CLR ne considère pas non plus que "out" et "ref" sont de types de paramètres formels différents; C # fait. 

Le CLR possède également une fonctionnalité intéressante appelée "modificateurs de types facultatifs et obligatoires", généralement appelée "modopts" et "modreqs". Il est possible d'annoter un type dans une signature de méthode avec un autre type qui vous renseigne sur le type "principal". Par exemple, en C++, il y a deux signatures différentes:

void M(C const & x);
void M(C & x);

Les deux signatures définissent une méthode M qui prend un paramètre de type "référence à C". Mais comme la première est une référence const et que la seconde ne l’est pas, le langage C++ considère qu’il s’agit de signatures différentes. Le CLR l'implémente en permettant au compilateur C++/CIL d'émettre un modopt pour un type spécial "this is const" sur le type de paramètre formel. 

Il n’existe aucun moyen de lire ou d’établir un mod en C #, mais le compilateur C # le sait néanmoins et les honorera à certains égards. Par exemple, si vous aviez une méthode virtuelle publique déclarée en C++/CIL comme:

void V(C const * x)

et vous écrasez le fait que dans une classe dérivée écrite en C #, le compilateur C # va pas appliquer la const const pour vous; le compilateur C # n'a aucune idée de ce que signifie const modopt. Mais le compilateur C # veillera à ce que la méthode de substitution soit émise dans les métadonnées avec modopt en place. Cela est nécessaire car le CLR requiert des signatures de méthodes surchargées et surchargées pour correspondre; le compilateur doit obéir aux règles CLR pour la correspondance des signatures, pas aux règles C #.

28
Eric Lippert

De MSDN:

La signature d'une méthode comprend le nom de la méthode, ainsi que le type et le type (valeur, référence ou sortie) de chacun de ses paramètres formels, pris en compte dans l'ordre croissant. La signature d'une méthode n'inclut pas spécifiquement le type de retour ni le modificateur params qui peut être spécifié pour le paramètre le plus à droite.

La partie importante ici est que le type de retour d'une méthode n'appartient pas à sa signature. Vous ne pouvez donc pas surcharger les méthodes qui diffèrent par le type de retour uniquement!

12
Robert Hegner

La signature de méthode est l'ensemble des attributs d'une méthode qu'un compilateur peut utiliser pour identifier la méthode.

Les attributs sont les suivants: Nom de la méthode, nombre de paramètres, type de paramètre et ordre des paramètres.

Exemple de différentes signatures de méthode:

Foo()
Foo(int)
Foo(String)
Foo(int, string)
Foo(string, int)

Toutes ces méthodes sont différentes, et lorsque vous les appelez dans le code, le compilateur peut déduire quelle méthode vous souhaitez exécuter à l'aide de la signature de méthode.

N'oubliez pas la portée des méthodes en programmation modulaire ...

9
jlvaquero

La signature de la méthode comprend les éléments suivants:

  • Le nom de la méthode.
  • Le nombre de paramètres.
  • Les types de données et Ordre des paramètres.

Remarque: le type de retour ne fait pas partie de la signature.

5
Prateek

Dans votre exemple ci-dessus, la signature de la méthode est Foo (int x, int y). Ceci est important à savoir car dans les langages qui autorisent la surcharge de méthodes (telles que C # et Java), le nom de la méthode sera le même, mais la signature doit être différente. 

1
BMB

La section 3.6 de la spécification du langage C # (v 4.0) fournit la réponse la plus précise concernant les signatures de méthode:

La signature d'une méthode consiste en le nom de la méthode, le nombre de paramètres de type et type et genre (valeur, référence ou sortie ) de chacun de ses paramètres formels, considérés dans l'ordre restant. à droite. À ces fins, tout paramètre de type de la méthode qui se produit dans le type d'un paramètre formel est identifié pas par son nom, mais par sa position ordinale dans la liste des arguments de type du méthode. La signature d'une méthode n'inclut pas le return type, le modificateur params pouvant être spécifié pour le fichier paramètre le plus à droite, ni les contraintes de paramètre de type facultatif.

0
Mike Cowan