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

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

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

Это комбинация имени метода и списка параметров

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

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

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

void V(C const * x)

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

Ответ 2

Из MSDN:

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

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

Ответ 3

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

Признаками являются: имя метода, количество параметров, тип параметра и порядок параметров.

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

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

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

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

Ответ 4

Подпись метода включает следующие элементы:

  • Имя метода.
  • Число параметров.
  • Типы данных и порядок параметров.

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

говорит:

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

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

" Примечание

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