![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
VOX |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 21.1.2009 Репутация: нет Всего: 1 |
Здравствуйте!
Я неоднократно видел посты ( на этой конференции так же), в которых возникали споры, суть которых: Метод и ф-ия одно и тоже? Прошу прояснить этот вопрос, здесь я прочитал вот это: Если объект вызывает не свойство, а метод, то вызов метода сопровождается заданием фактических аргументов: x.M(a1, … ak) Когда такой вызов встречается в выражениях, метод должен возвращать значение, отличное от void (быть функцией), чтобы такое выражение могло быть использовано в качестве операнда какой-либо операции. Верно ли что: метод не void, т.е. который что-то возвращает, есть ф-ия. Спасибо за ваше внимание! |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
VOX, Любой метод, возвращающий значение - есть функция. Просто под методом обычно понимают метод какого-либо типа(класса, структуры), а функция может существовать и сама по себе(вне классов). В шарпе процедурный стиль не поддерживается, поэтому все функции являются методами каких-нибудь типов. А вообще в разных языках существуют разночтения относительно этих понятий. Например взять бейсик, если ты создашь бейсик-проект и заглянешь обозреватель объектов, то сможешь обнаружить, что при группировке членов типов методы выделяются отдельно от функций, там просто методы, возвращающие значение и не возвращающие - по сути разные вещи. Они даже объявляются по-разному, вот их и выделили отдельно и так назвали, а если ту же библиотеку просмотреть в шарповском варианте обозревателя, то методами окажется всё, в том числе те, которые в бейсике выделялись как функции.
Считается, что в ООП понятия функций, процедур и подпрограмм обобщаются понятием метода. Вот как-то так. А вообще это всё не принципиально. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
VOX |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 297 Регистрация: 21.1.2009 Репутация: нет Всего: 1 |
Я понял, +++, спасибо за развернутый ответ!
|
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
VOX, да кстати чойт вспомнил вдруг...в шарпе таки есть функции, не являющиеся методами. Замыкания - тоже функции, но методами они не являются.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
diadiavova, так вроде они называются Anonymous Methods...
|
|||
|
||||
ДобренькийПапаша |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 14.1.2006 Где: г.Москва Репутация: 3 Всего: 7 |
а можно пример анонимус-метода, а то что-то запамятовал.
-------------------- Меня зовут Себастьян Парейра, торговец чёрным деревом. |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Я не совсем это имел в виду, но замечание принимаю. Просто мне видимо не стоило проецировать на шарп понятия, почерпнутые в бейсике. Там пока анонимных методов нет и замыкания создаются только одним способом - при помощи лябда-выражений. Ну да я упоминал о том, что путаница с этими понятиями существует.
Это сообщение отредактировал(а) diadiavova - 8.12.2009, 22:34 -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
PashaPash |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Лямбда-выражение - это функция в математическом смысле. Как только пытаешься ее вызвать - она компилируется в вполне нормальный метод ![]()
Для полноты картны надо рассматривать в отладке. Это я как бы к тому, что в vb.net уже есть обычные анонимные методы, с синтаксисом сразу через лямбды. И к тому, что путаницы между понятиями замыкание (или как оно vb.net) и анонимный метод существовать не может - это одно понятие, просто в C# для него есть два разных синтаксиса. Но il на выходе одинаковый. Это сообщение отредактировал(а) PashaPash - 9.12.2009, 02:18 |
||||
|
|||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Точнее анонимные функции. Анонимные подпрограммы там только в 10-й версии появятся(или если угодно появились), а уж коль скоро там между методами и функциями делаются различия, то пока там есть только анонимные функции ![]() Ну я ещё раз повторяю, что существуют разночтения в этих понятиях. На сколько я понимаю, слово "метод" первоначально обозначало "метод какого-либо типа". В процессе развития языков и технологий, появлялись различные нестыковки, отсюда путаница. В том же бейсике почему ввели деление на методы и функции, при том что никто не утверждает, что функция - не метод? Да всё очень просто: метод не возвращающий значения там называется Sub. Это - сокращение от subrutine, ну это же уже точно не соответствует его сегодняшнему статусу(какая нафиг подпрограмма ![]() -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
diadiavova, особенности названий методов в vb - это проблемы программистов на vb
![]() В самом .net, на уровне CLR - есть только методы, причем все - неанонимные ![]() |
|||
|
||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Если бы она была решена, этого топика не появилось бы. Разночтения существуют в книгах, статьях и документации. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
ДобренькийПапаша |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 14.1.2006 Где: г.Москва Репутация: 3 Всего: 7 |
Полностью согласен с diadiavova. Разночтения существуют в книгах, подтверждаю)))
-------------------- Меня зовут Себастьян Парейра, торговец чёрным деревом. |
|||
|
||||
PashaPash |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Этот топик появился из-за разночтения в голове у автора курсов интуита ![]() "отличное от void (быть функцией)" и "могло быть использовано в качестве операнда какой-либо операции", когда в спеке по C# все в более общем виде сформулировано. 7.1 Expression classifications An expression is classified as one of the following: ...• Nothing. This occurs when the expression is an invocation of a method with a return type of void. An expression classified as nothing is only valid in the context of a statement-expression (§8.6). 8.6 Expression statements An expression-statement evaluates a given expression. The value computed by the expression, if any, is discarded. expression-statement: statement-expression; statement-expression: invocation-expression .... Функции в спеке не упоминаются. Т.е. "быть функцией", IMHO, просто так приписано. Получается суровый персказ спеки своими словами. Добавлено через 4 минуты и 34 секунды
Читай правильные книги ![]() |
||||
|
|||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Ну вот зачем это буквоедство? Вопрос возник по вполне понятным, чисто практическим причинам. В литературе, документации, статьях и даже сообщениях форумов используются не только понятия описанные в спецификации. Для того, чтобы понимать о чём речь, представление о них надо иметь. Допустим в спецификации речь не идёт о функциях вообще и что из этого следует? Что функций в шарпе нет в принципе или что в спецификации они просто по-другому названы? И чем, интересно знать, васиковые функции отличаются от шарповских невойд-методов? Наверно кроме спецификации шарпа существуют ещё и общепринятые в информатике понятия. Да, терминология иногда размыта, но непонимание значения терминов вряд ли кому-то принесёт пользу. Тем более, что авторы книг, документов и статей далеко не всегда следуют логике спецификаций. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
Skynin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 1.7.2007 Где: Харьков Репутация: 0 Всего: 10 |
Функция - именованый блок кода который что-то возвращает.
Процедура - именованый блок кода который ничего не возвращает, но что-то, где-то изменяет. Во многих языках от второй сущности отказались, и процедура есть частный случай функции с возвращаемым значением void. Для подчеркивания различия этих концепций в функциональном программировании выделяют чистые функции - то есть такие которые ничего не меняют. В С++ - такие методы помечают const. В Ruby - знаком ! (кажется им) Методы в ООП - названы отдельным словом чтобы подчеркнуть концепцию что - "передача сообщения объекту". То есть что мы не просто вызываем некий блок кода, а конкретного объекта, с данными конкретного объекта. И получается что метод, это такая функция которой первым параметром неявно передается ссылка на объект. Вариант - функция (не метод), в силу приверженности синтаксису ООП записываемая как метод принадлежащий классу, а не объекту. То есть в который не передается неявная ссылка на объект. Общим же является понятие - блок кода. И тут появляется вариант - неименованый блок кода. Оформить его можно по разному. Суть остается та же - передаем параметры. И часть из них - неявные. Как у метода - ссылка на объект, но если оформляем как замыкание, то передаются еще и значения переменных окружения. Чтобы уйти от этих различий в рассказе о синтаксисе языка используют термин - выражение. То бишь функции, процедуры, методы, замыкания, это как - "существительные", "прилагательные" и т.д. а если нам надо в общем сказать то используем термин - "слово". В итоге спецификации по синтаксису языка программирования нужно читать как: Слова в предложении отделяются пробелами. Слово может быть существительным, прилагательным, союзом и т.д. Союзы не могут стоять перед точкой. ... А если язык - объектно-ориентированный, то чтобы запомнилась разница, в спецификации стараются избегать термина функция, а употреблять - метод. Хотя метод, это такая функция или процедура, которая принадлежит классу или объекту. Авторы же книг, наверняка владеющие не одним языком программирования не такие зануды, и употребляют термины более вольно, усвоив эту разницу "в детском садике еще", и даже не догадываясь что читающий этой разницы может и не знать, или недопонимать. Это сообщение отредактировал(а) Skynin - 9.12.2009, 18:47 |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |