Определение сигнатуры метода?
Какое правильное определение сигнатуры метода (или сигнатуры метода)?
В 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 Методы (Руководство по программированию на С#)
говорит:
Способы объявляются в классе или структуре, указывая доступ таких как публичные или частные, необязательные модификаторы, такие как абстрактные или запечатанное, возвращаемое значение, имя метода и любой метод параметры. Эти части вместе являются сигнатурой метода.
И дальше, чего я не видел среди других ответов:
" Примечание
" Возвращаемый тип метода не является частью сигнатуры метода для перегрузки метода. Тем не менее, это часть сигнатуры метода при определении совместимости между делегат и метод, который он указывает на "