[ITVDN] C# Essential - неточность в объяснении сигнатуры/метода?

Урок 2 - классы и объекты.
Время 6.44
Автор говорит "Только сигнатура метода, тела нет."

В презентации, на стр 3, в теме частичные методы написано аналогично.

partial class PartialClass
{
partial void PartialMethod();
partial void MyMethod();
}

В дальнейших уроках, при рассмотрении интерфейсов, подобная конструкция уже называется методом. Абстрактным методом, например.

abstract class AbstractClass
    {
        public abstract void Method();
    }

Но метод не сигнатура.

Согласно спецификации языка C# (Сигнатура метода состоит из имени метода, числа параметров...и далее по тексту) определяет сигнатуру как не содержащую возвращаемый тип.

То есть
partial void PartialMethod();
Метод. Не сигнатура. Значит в презентации и видео ошибка.

Возможно ошибка вызвана тем, что:
"Спецификация CLI определяет его как содержащий тип возвращаемого значения." То есть для CLI это сигнатура. Но CLI другой язык, не C#.

В ходе изучения возникает путаница между методом и сигнатурой.

Я немного не понял в чем именно неточность. Получается вы утверждаете что в следующем коде нет сигнатуры метода.
partial void PartialMethod();

Вот ссылка на документацию

Методы объявляются в class или struct, для чего указывается следующее:
Уровень доступа (необязательно), например public или private. Значение по умолчанию — private.
Необязательные модификаторы, например abstract или sealed.
Возвращаемое значение или void, если у метода его нет.
Имя метода.
Любые параметры методов. Параметры метода заключаются в скобки и разделяются запятыми. Пустые скобки указывают, что параметры методу не требуются.
Вместе все эти части формируют сигнатуру метода.

Я считаю правильным утверждение, что "partial void PartialMethod();" это только сигнатура. Ну и в любом методе есть сигнатура не зависимо от того частичный он или абстрактный. В интерфейсах сигнатуры методов можно называть методами, потому что в интерфейсах указываются всегда сигнатуры без реализации, тоже самое можно говорить и абстрактных методах. Абстрактный метод - это только сигнатура без реализации.

Я считаю, что partial - это модификатор, void - тип возвращаемого значения PartialMethod() - сигнатура метода ; - тело метода (да-да тело это ; равно как и => или {}).
Так говорит спецификация языка.
Почему вы тут видите только сигнатуру - неясно.

Нет. Сигнатура - не метод. Это 2 разных вещи.

Методы без реализации. Не сигнатуры.
Читайте в спецификации, что есть сигнатура.
Вы не можете в коде написать только сигнатуру. Метод можете.

Вас не смущает выражение Method();? А зачем ему точка с запятой в конце?
Вот же метод Method(){} Без точки с запятой.
А ; - это тело метода. Причем особенное, без реализации.
А тело {} - с NOP реализацией.

Не путайте тело метода и его реализацию.

Как видите, в курсе есть неточности. Если хорошо разобраться.

Я сбросил ссылку на msdn там написано, модификатор доступа, модификатор sealed и др., возвращаемый тип, имя и параметры формируют сигнатуру метода. В пометке указано "Тип возврата метода не является частью сигнатуры метода в целях перегрузки метода."

Я вижу там сигнатуру метода потому что там нет тела с инструкциями, а только сигнатура, даже если по спецификации там есть тело. Ну и за много лет практики общаясь с другими разработчиками обычно это называл сигнатурой и другие разработчики void Method(); называют сигнатурой. А когда есть void Method() { инструкции } это называют методом, так проще и всем понятно, хоть может это и не так как написано в спецификации.

Сбросьте, пожалуйста, ссылку на спецификацию где сказано про сигнатуру метода и на то что ; это тело частичного метода, буду благодарен. Смущает утверждение что ; это тело метода, разве это не оператор?

Мне уже кажется странным, что модификатор формирует сигнатуру метода.

Вот вам текст из официального документа.
ECMA-334
8.6
The signature of a method consists of the name of the method, the number of type parameters, and
the type and parameter-passing mode (value, reference, or output) of each of its formal parameters,
considered in the order left to right.

Похоже, в msdn не всё верно. С чем согласны многие программисты С#.

Вот вам метод с телом без инструкций Method(){}
И вот вам ещё один метод с телом без инструкций Method();

Я стараюсь называть вещи правильно. Чтобы потом не переучиваться.
Не всегда это выходит, но если есть спецификация, если там всё написано - то почему бы и нет?
Многие называют это сигнатурой, но вот эксперты называют это методом. И рекомендуют читать спецификацию.

И меня смутило. Я же не профессионал, а только учусь.
Но потом возник вопрос. А почему тут Method(){} нет точки с запятой, а тут есть Method();?
Почему Александр в частичных методах говорит сигнатура, а в абстракции метод?

15.6.1
For abstract and extern methods, the method-body consists simply of a semicolon. For partial
methods the method-body may consist of either a semicolon or a block.

PS
Всё вышеописанное не знания новичка. Этими вопросами мне пришлось помучить профи, за что я им благодарен.

Спасибо за вырезки из спецификации.

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

Абсолютно правильный подход, лучше сразу все учить правильно.

В презентации к уроку, где по Вашему мнению ошибка, написано -
"Частичные методы это методы, где «прототип» или сигнатура метода определена при создании частичного класса, а реализация выполняется в любой другой (только одной) части этого класса"
Там не сказано что частичные методы это сигнатура, написано что частичные методы это методы. Реализация метода происходит отдельно от его определения (это тоже указано в спецификации). Упущение того факта, что у частичного метода тело представлено точкой с запятой не искажает представления о частичных методах. В видео Александру лучше было сказать "Частичный метод состоит из сигнатуры и тела, представленного точкой с запятой. Если тело представлено блоком, и имеет ту же сигнатуру что и метод с телом представленным точкой с запятой то такой метод является реализацией частичного метода.", чтобы избежать неоднозначности.

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

Важно правильное понимание. Идеология. И в видео Александра Шевчука это есть. Но как я сказал, есть и неточности.

В первом случае метод реализован. Во втором нет.
Первый метод не реализовать - он уже реализован. А второй должен быть реализован в не абстрактном наследнике. Дальше можно продолжить говорить про все те операции, что работают с телом метода и парадигмы ООП.

Да, вы можете сказать - и там и там ничего нет. И проектировать своё приложение исходя из этого.
А можете исходить из спецификации и проектировать приложения теми конструкциями языка и так, как это было задумано разработчиками.
Понимание сути объекта позволяет применять его правильно.

А так да - можно и поля называть переменными, методы функциями и писать ООП код в процедурном стиле. Но зачем?

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

Вот время и фраза. И далее будут подобные утверждения. Далее тоже это есть.
Именно это побудило меня разобраться в теме.

Я надеюсь мы про это видео говорим :slight_smile: Видео курс C# базовый (ООП). Классы и объекты. Диаграммы классов. – курсы ITVDN?

Я перечитал Ваш первый пост перед тем как писать предыдущий комментарий, и мне показалось, что претензия в том, что Александр Шевчук не называет частичный метод методом, а называет его сигнатурой без тела. Поэтому я и написал "что частичные методы это методы", в этом не смысл, в этом утверждение того, что автор назвал объясняемую конструкцию правильно.

В этом уроке конструкция называется методом (автор так и сказал на 6:26 "частичные методы это методы где ..."), в дальнейших уроках, при рассмотрении интерфейсов, подобная конструкция тоже называется методом. Тут частичный метод в следующих уроках - абстрактный метод.

В презентации написано "Частичные методы это методы, где «прототип» или сигнатура метода определена при создании частичного класса, а реализация выполняется в любой другой (только одной) части этого класса". При объяснении кода автор сказал, что частичный метод состоит из сигнатуры и не имеет тела (возможно автор имел в виду, что нет реализации)

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

Как и сказал - и далее..

C# Essential
Урок 2. Диаграммы и классов.
Время 10.47
Александр говорит "Мы видим что на шестой строке мы создаем partial class - PartialClass. В теле этого класса на девятой строке мы объявляем частичный метод с именем PartialMethods.
Обратите внимание здесь используется только его сигнатура, но не используется тело. Здесь нет тела."

Эта фраза неверна. Тело есть.