Каково правильное определение сигнатуры метода (или сигнатуры метода)?
Вкл. Google, я нахожу различные определения:
Это комбинация имени метода и списка параметров
Означает ли это подпись метода = имя метода + список аргументов
? Тогда я не вижу разницы между « метод » и « сигнатура метода ».
Если у меня есть метод:
public void Foo(int x, int y) { ... }
Будет ли моя сигнатура метода одной из следующих или ни одной?
Как я могу ответить, если кто-то спросит меня, какова сигнатура метода?
Здесь есть ряд правильных ответов, которые определяют сигнатуру метода как имя метода, общую арность, арность формального параметра и типы и виды формальных параметров, но не тип возвращаемого значения или модификатор «params» .
Хотя это правильно, здесь есть некоторые тонкости. язык C # определяет сигнатуру метода отличается от того, как CLR определяет сигнатуру метода, и это может привести к некоторым интересным проблемам при взаимодействии между C # и другими языками.
Для CLR сигнатура метода состоит из имени метода, общей арности, арности формальных параметров, типов и видов формальных параметров и типа возврата. Итак, есть первое отличие; CLR учитывает тип возвращаемого значения.
CLR также не считает, что «out» и «ref» имеют разные виды формальных параметров; C # делает.
CLR также имеет интересную функцию, называемую «необязательные и обязательные модификаторы типов», обычно называемые «modopts» и «modreqs». Можно пометить тип в сигнатуре метода с помощью другого типа , который сообщает вам о «основном» типе. Например, в C ++ это две разные подписи:
void M(C const & x);
void M(C & x);
Обе подписи определяют метод M, который принимает параметр типа «ссылка на C». Но поскольку первая является константной ссылкой, а вторая - нет, язык C ++ считает, что это разные сигнатуры. CLR реализует это, позволяя компилятору C ++ / CIL выдавать modopt для специального типа «this is const» для формального типа параметра.
Нет способа прочитать или установить мод в C #, но компилятор C #, тем не менее, знает о них и будет соблюдать их в некотором роде . Например, если у вас был открытый виртуальный метод, объявленный в C ++ / CIL, например:
void V(C const * x)
, и вы переопределяете его в производном классе, написанном на C #, компилятор C # не будет не применять правильность для вас; компилятор C # понятия не имеет, что означает const modopt. Но компилятор C # гарантирует, что переопределяющий метод будет передан в метаданные при установленном modopt. Это необходимо, потому что CLR требует подписи переопределенных и переопределенных методов для сопоставления; компилятор должен подчиняться правилам CLR для сопоставления подписи, а не правилам C #.
Подпись метода - это набор атрибутов метода, который компилятор может использовать для идентификации метода.
Атрибуты: имя метода, количество параметров, тип параметра и порядок параметров.
Пример различных сигнатур методов:
Foo()
Foo(int)
Foo(String)
Foo(int, string)
Foo(string, int)
Все эти методы различны, и когда вы вызываете их в коде, компилятор может определить, какой метод вы намереваетесь выполнить, используя сигнатуру метода.
Не забывайте о масштабах методов модульного программирования ...
В приведенном выше примере сигнатурой метода является Foo (int x, int y). Это важно знать, потому что в языках, которые допускают перегрузку методов (таких как C # и Java), имя метода будет одинаковым, но подпись должна отличаться.