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

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

Вкл. Google, я нахожу различные определения:

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

Означает ли это подпись метода = имя метода + список аргументов ? Тогда я не вижу разницы между « метод » и « сигнатура метода ».

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

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

Будет ли моя сигнатура метода одной из следующих или ни одной?

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

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

23
задан Sнаđошƒаӽ 31 July 2016 в 06:28
поделиться

3 ответа

Здесь есть ряд правильных ответов, которые определяют сигнатуру метода как имя метода, общую арность, арность формального параметра и типы и виды формальных параметров, но не тип возвращаемого значения или модификатор «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 #.

28
ответ дан 29 November 2019 в 01:22
поделиться

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

Атрибуты: имя метода, количество параметров, тип параметра и порядок параметров.

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

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

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

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

9
ответ дан 29 November 2019 в 01:22
поделиться

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

1
ответ дан 29 November 2019 в 01:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: