Определение сигнатуры метода?

каково правильное определение сигнатуры метода (или сигнатуры метода)?

в google я нахожу различные определения:

это совокупность имени метода и списка параметров

значит method signature = method name + argument list? Тогда я не вижу разницы между "метод" и "сигнатуру метода".

Если у меня есть метод:

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

будет ли моя подпись метода одной из следующих, или нет?

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

Как мне ответить, если кто-то спросит, Что такое сигнатура метода?

7 ответов


здесь есть несколько правильных ответов, которые определяют сигнатуру метода как имя метода, общую арность, формальную арность параметра и формальные типы параметров и виды, но не модификатор типа возврата или "params".

хотя это правильно, здесь есть некоторые тонкости. Путь язык C# определяет подпись метода отличается от способа CLR определяет сигнатуру метода, что может привести к некоторым интересным проблемы при взаимодействии между C# и другими языками.

для среды CLR сигнатура метода состоит из имени метода, общего arity, формального параметра arity, формальных типов параметров и видов и возвращаемого типа. Таким образом, есть первое различие; среда CLR рассматривает возвращаемый тип.

среда CLR также не считает, что "out" и "ref" имеют разные виды формальных параметров; C# делает.

CLR также имеет интересную функцию под названием " необязательно и требуется модификаторы типа", обычно называемые "modopts"и " modreqs". Можно аннотировать тип в сигнатуре метода с другой тип это говорит вам о" основном " типе. Например, в C++ это две разные подписи:

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

обе подписи определяют метод M, который принимает параметр типа "ссылка на C". Но поскольку первый является ссылкой const, а второй-нет, язык C++ считает, что это разные подписи. сброс реализует это, позволяя компилятору C++/CIL испускать modopt для специального типа "this is const" для формального типа параметра.

нет способа прочитать или установить мод в C#, но компилятор C# тем не менее знает о них и будет уважать их в некоторых случаях. Например, если у вас есть общедоступный виртуальный метод, объявленный в C++ / CIL, например:

void V(C const * x)

и вы переопределяете это в производном классе, написанном на C#, компилятор C# будет не обеспечьте правильность const для вас; компилятор C# понятия не имеет, что означает const modopt. Но компилятор C# гарантирует, что метод переопределения будет излучен в метаданные с modopt на месте. Это необходимо, поскольку среда CLR требует соответствия сигнатур переопределяющих и переопределенных методов; компилятор должен подчиняться правилам среды CLR для сопоставления сигнатур, а не правилам C#.


из MSDN:

сигнатура метода состоит из имени метода и типа и вида (значения, ссылки или вывода) каждого из его формальных параметров, рассматриваемых в порядке слева направо. Сигнатура метода специально не включает возвращаемый тип, а также модификатор params, который может быть указан для самого правого параметра.

важной частью здесь является то, что возвращаемый тип метода не принадлежат его подписи. Таким образом, вы не можете перегружать методы, которые отличаются только типом возврата!


сигнатура метода-это набор атрибутов метода, который компилятор может использовать для идентификации метода.

attrbutes: имя метода, количество параметров, тип параметра и порядок параметров.

пример сигнатур различных методов:

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

все эти methos различны, и когда вы вызываете их в коде, компилятор может определить, какой метод вы намереваетесь выполнить, используя сигнатуру метода.

Не забывайте область применения методов модульного программирования...


сигнатура метода включает в себя следующие элементы:

  • название метода.
  • количество параметров.
  • типы данных и порядок параметров.

Примечание: возвращаемый тип не является частью подписи.


в вашем примере выше сигнатура метода Foo(int x, int y). Это важно знать, потому что в языках, которые допускают перегрузку метода (например, C# и Java), имя метода будет одинаковым, но подпись должна быть другой.


раздел 3.6 спецификации языка C# (v 4.0) дает наиболее точный ответ относительно сигнатур метода:

сигнатура метода состоит из имени метода, количество параметров типа, а также тип и вид (значение, ссылка или выход) каждого из его формальных параметров, рассматриваемых в порядке слева направо. Для этих целей любой параметр типа метода, который происходит в типе формального параметра, идентифицируемого не по свой имя, но по порядковому номеру в списке аргументов типа метод. Сигнатура метода конкретно не включает возвращаемый тип, модификатор params, который может быть указан для right-most параметр, ни необязательные ограничения параметра типа.


статья MSDN " Методы (Руководство По Программированию На C#)"

говорит:

методы объявляются в классе или в структуре путем указания на доступ к уровень, такой как public или private, необязательные модификаторы, такие как abstract или запечатано, возвращаемое значение, имя метода и любой метод параметры. Эти части вместе являются сигнатурой метода.

и далее, что я не видел среди других ответов:

"Примечание

"тип возврата метода не является частью сигнатуры метода для целей перегрузки метода. Тем не менее, это часть подписи метода при определении совместимости между делегировать и метод, который он указывает на"