Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 98, средняя оценка - 4.97
red_metallist
2 / 2 / 0
Регистрация: 29.08.2013
Сообщений: 14
#1

Что такое сигнатура метода? - C#

12.12.2013, 22:06. Просмотров 17568. Ответов 13
Метки нет (Все метки)

Ребят,подскажите,что такое сигнатура метода?Всё уже облазил,но не получил толкового ответа
http://www.cyberforum.ru/csharp-beginners/thread761860.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2013, 22:06
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Что такое сигнатура метода? (C#):

Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)?
public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration...

Что такое статический метод и что за слово static?
Господа, разъясните пожалуйста тугому Что такое статический метод и что за...

Что такое API и что подразумевается под interface
Всем привет подскажите что такое API( application programming interface),мне...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: ...

Что такое ? в c#?
Привет всем. Есть вот такая строка: WinApiRegistryKey programKey =...

13
MansMI
1447 / 1156 / 549
Регистрация: 08.01.2012
Сообщений: 4,509
12.12.2013, 22:10 #2
набор/последовательность передаваемых ему параметров
0
red_metallist
2 / 2 / 0
Регистрация: 29.08.2013
Сообщений: 14
12.12.2013, 22:12  [ТС] #3
это же я ответил своему преподавателю по программированию,когда он спросил,но он сказал,что этого мало, и отправил готовиться =(
0
Winhttp22
151 / 122 / 22
Регистрация: 16.02.2013
Сообщений: 815
13.12.2013, 02:17 #4
MansMI, и возвращаемого значения ?
0
kolorotur
Эксперт .NET
9919 / 8304 / 2037
Регистрация: 17.09.2011
Сообщений: 14,289
13.12.2013, 02:39 #5
Имя метода, количество и тип(ы) аргументов и их последовательность.
Возвращаемое значение в шарпе частью сигнатуры не является.
3
turbanoff
Эксперт Java
4008 / 3743 / 739
Регистрация: 18.05.2010
Сообщений: 9,323
Записей в блоге: 11
Завершенные тесты: 1
13.12.2013, 09:31 #6
И еще имена параметров, забыли.
0
sbun
1 / 1 / 3
Регистрация: 25.11.2012
Сообщений: 24
13.12.2013, 16:48 #7
Сигнатура метода включает в себя:
- Пространство имен и класс
- Идентификатор метода
- Порядок, тип, модификаторы(ref, out) параметров
Но не включает:
- Тип возвращаемого значения
- Модификатор static
0
kolorotur
Эксперт .NET
9919 / 8304 / 2037
Регистрация: 17.09.2011
Сообщений: 14,289
13.12.2013, 18:05 #8
Цитата Сообщение от turbanoff Посмотреть сообщение
И еще имена параметров, забыли.
Имена параметров не являются частью сигнатуры.
0
turbanoff
Эксперт Java
4008 / 3743 / 739
Регистрация: 18.05.2010
Сообщений: 9,323
Записей в блоге: 11
Завершенные тесты: 1
13.12.2013, 18:16 #9
Цитата Сообщение от kolorotur Посмотреть сообщение
Имена параметров не являются частью сигнатуры.
Если говорить, про язык C# - то имена параметров являются часть сигнатуры.
Пример:
C#
1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args) {
    Method1(a:1);
    Console.ReadKey();
}
 
static void Method1(int b) {
    Console.WriteLine("int");
}
 
static void Method1(double a) {
    Console.WriteLine("double");
}
Компилятор выбирает метод, который должен вызваться, по сигнатуре. И в данном случае выбирается именно в зависимости от имени параметра.
2
kolorotur
Эксперт .NET
9919 / 8304 / 2037
Регистрация: 17.09.2011
Сообщений: 14,289
13.12.2013, 19:02 #10
turbanoff, сигнатура — это то, что однозначно идентифицирует конкретный метод.

C#
1
2
void Foo(int a) {}
void Foo(int b) {}
Не скомпилируется, т.к. у обоих методов одинаковая сигнатура.

Слово спеку:
3.6 Signatures and overloading
The signature of a method consists of the name of the method, the number of type parameters and the type and kind (value, reference, or output) of each of its formal parameters, considered in the order left to right. For these purposes, any type parameter of the method that occurs in the type of a formal parameter is identified not by its name, but by its ordinal position in the type argument list of the method. The signature of a method specifically does not include the return type, the params modifier that may be specified for the right-most parameter, nor the optional type parameter constraints.
Ваш пример — это форсированный вызов конкретной перегрузки метода, только вместо ручного каста используется имя параметра, которое компилятор, фактически, заменит на обычный Method1((double)1).
То есть синтаксический сахар, вроде var.
Получившийся CIL на это как бы намекает:
C#
1
IL_000c:  call       void ConsoleApplication.Program::Method1(float64)
Хоть имя параметра и сохраняется в метаданных, но само по себе оно не служит для определения уникальности метода, то есть не является его сигнатурой.
2
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
13.12.2013, 21:23 #11
kolorotur, имхо возвращаемое значение также является частью сигнатуры, хотя и нельзя написать перегрузку с одинаковыми параметрами, возвращающими разный тип.
2
kolorotur
Эксперт .NET
9919 / 8304 / 2037
Регистрация: 17.09.2011
Сообщений: 14,289
13.12.2013, 23:15 #12
Цитата Сообщение от Psilon Посмотреть сообщение
имхо возвращаемое значение также является частью сигнатуры, хотя и нельзя написать перегрузку с одинаковыми параметрами, возвращающими разный тип.
Вы конкретно про шарп или про "в принципе"?
Если про шарп, то конкретно в этом языке возвращаемой значение не является частью сигнатуры. Конечно, если мы оперируем одним и тем же понятием "сигнатура", то бишь часть синтаксической конструкции, позволяющая однозначно идентифицировать функцию среди других.

Если про "вообще", то в разных языках по-разному.
В Си-подобных языках, насколько мне известно, возвращаемый тип не может являться частью сигнатуры из-за неоднозначности вызова при отсутствии присваивания возвращаемого значения:
C#
1
2
3
4
5
6
7
int Foo();
string Foo();
 
void Main()
{
   Foo(); // ???
}
Есть языки, где возвращаемый тип является частью сигнатуры (Ada, F#, Perl, Haskell, может еще что-то), но там либо вызов функции жестко привязан к контексту, в котором всегда однозначно известен возвращаемый тип, либо как-то по-другому обрабатывается вышеприведенная ситуация. В том же Haskell'e, например, если прописать вызов функции без присваивания результата переменной, то эта функция вызвана вообще не будет. А если результат присваивается, но из типа переменной нельзя однозначно определить вызываемую функцию, то компилятор ругнется и придется в месте вызова явно указывать тип возвращаемого этой функцией значения.

В общем, каждый дрочит, как хочет.
2
KoSeOl
1 / 1 / 0
Регистрация: 01.02.2016
Сообщений: 14
Завершенные тесты: 1
12.02.2018, 10:43 #13
Наткнулся на Ваш спор, а потому вот первоисточник
https://msdn.microsoft.com/ru-ru/library/ms173114(v=vs.120).aspx
1
kolorotur
Эксперт .NET
9919 / 8304 / 2037
Регистрация: 17.09.2011
Сообщений: 14,289
12.02.2018, 10:51 #14
Цитата Сообщение от KoSeOl Посмотреть сообщение
вот первоисточник
Ссылка на первоисточник — спецификацию языка, дана в десятом сообщении этой темы
Но все равно спасибо за вклад в общую копилку знаний.
0
12.02.2018, 10:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2018, 10:51
Привет! Вот еще темы с решениями:

Что такое Name<T>
Здравствуйте,читаю Герберта Шилдта,в главе про многопоточное программирования...

Что такое \n
Наверно банальный вопрос, что означает вот эта штука \n ? Погуглил не нашел.

Что такое \t?
Здравствуйте, я вернулся =) долго меня не было, уж извините, как работа...

Что такое RESX?
Что такое RESX? Как я понял это файл для хранения чего-то. А зачем он?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru