Модераторы: Partizan, gambit

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> С# | Различия (метод-функция) 
V
    Опции темы
VOX
Дата 7.12.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 21.1.2009

Репутация: нет
Всего: 1



Здравствуйте!
Я неоднократно видел посты ( на этой конференции так же),
в которых возникали споры, суть которых:
Метод и ф-ия одно и тоже?
Прошу прояснить этот вопрос,
здесь я прочитал вот это:
Если объект вызывает не свойство, а метод, то вызов метода сопровождается заданием фактических аргументов:

x.M(a1, … ak)
            

Когда такой вызов встречается в выражениях, метод должен возвращать значение, отличное от void (быть функцией), чтобы такое выражение могло быть использовано в качестве операнда какой-либо операции. 


Верно ли что:
метод не void, т.е. который что-то возвращает, есть ф-ия.
Спасибо за ваше внимание!
PM MAIL   Вверх
diadiavova
Дата 7.12.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



VOX,  Любой метод, возвращающий значение - есть функция. Просто под методом обычно понимают метод какого-либо типа(класса, структуры), а функция может существовать и сама по себе(вне классов). В шарпе процедурный стиль не поддерживается, поэтому все функции являются методами каких-нибудь типов. А вообще в разных языках существуют разночтения относительно этих понятий. Например взять бейсик, если ты создашь бейсик-проект и заглянешь обозреватель объектов, то сможешь обнаружить, что при группировке членов типов методы выделяются отдельно от функций, там просто методы, возвращающие значение и не возвращающие - по сути разные вещи. Они даже объявляются по-разному, вот их и выделили отдельно и так назвали, а если ту же библиотеку просмотреть в шарповском варианте обозревателя, то методами окажется всё, в том числе те, которые в бейсике выделялись как функции.
Считается, что в ООП понятия функций, процедур и подпрограмм обобщаются понятием метода. Вот как-то так. 
А вообще это всё не принципиально.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
VOX
Дата 8.12.2009, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 297
Регистрация: 21.1.2009

Репутация: нет
Всего: 1



Я понял, +++, спасибо за развернутый ответ!
PM MAIL   Вверх
diadiavova
Дата 8.12.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



VOX, да кстати чойт вспомнил вдруг...в шарпе таки есть функции, не являющиеся методами. Замыкания - тоже функции, но методами они не являются.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
PashaPash
Дата 8.12.2009, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



diadiavova, так вроде они называются Anonymous Methods...


--------------------
PM MAIL WWW   Вверх
ДобренькийПапаша
Дата 8.12.2009, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



а можно пример анонимус-метода, а то что-то запамятовал.


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
diadiavova
Дата 8.12.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(PashaPash @  8.12.2009,  20:01 Найти цитируемый пост)
diadiavova, так вроде они называются Anonymous Methods... 
Я не совсем это имел в виду, но замечание принимаю. Просто мне видимо не стоило проецировать на шарп понятия, почерпнутые в бейсике. Там пока анонимных методов нет и замыкания создаются только одним способом - при помощи лябда-выражений. Ну да я упоминал о том, что путаница с этими понятиями существует.

Это сообщение отредактировал(а) diadiavova - 8.12.2009, 22:34


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
PashaPash
Дата 9.12.2009, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(diadiavova @  8.12.2009,  22:33 Найти цитируемый пост)
Там пока анонимных методов нет и замыкания создаются только одним способом - при помощи лябда-выражений.

Лямбда-выражение - это функция в математическом смысле. Как только пытаешься ее вызвать - она компилируется в вполне нормальный метод smile Вообще лямбда превращается в анонимный метод или дерево выражений (LambdaExpression) еще на этапе компиляции.
Код

// после компиляции - обычный анонимный метод в текущем классе
    Func<int, int> someFunc = x => x * x;
// то же самое, но через олдовый синтаксис. решарпер, кстати, подчеркивает return и говорит use lambda expression :)
    Func<int, int> someOldFunc = delegate(int x) { return x * x; }; 
// после компиляции - переменная с деревом выражений
    Expression<Func<int, int>> someExpression = x => x * x;
// после выполнения - динамически скомпиленный метод черт знает где
    Func<int, int> compiled = someExpression.Compile();

Для полноты картны надо рассматривать в отладке.

Это я как бы к тому, что в vb.net уже есть обычные анонимные методы, с синтаксисом сразу через лямбды. И к тому, что путаницы между понятиями замыкание (или как оно vb.net) и анонимный метод существовать не может - это одно понятие, просто в C# для него есть два разных синтаксиса. Но il на выходе одинаковый.

Это сообщение отредактировал(а) PashaPash - 9.12.2009, 02:18


--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 9.12.2009, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(PashaPash @  9.12.2009,  02:16 Найти цитируемый пост)

Это я как бы к тому, что в vb.net уже есть обычные анонимные методы, с синтаксисом сразу через лямбды.

Точнее анонимные функции. Анонимные подпрограммы там только в 10-й версии появятся(или если угодно появились), а уж коль скоро там между методами и функциями делаются различия, то пока там есть только анонимные функции smile 
Ну я ещё раз повторяю, что существуют разночтения в этих понятиях. На сколько я понимаю, слово "метод" первоначально обозначало "метод какого-либо типа". В процессе развития языков и технологий, появлялись различные нестыковки, отсюда путаница.
В том же бейсике почему ввели деление на методы и функции, при том что никто не утверждает, что функция - не метод? Да всё очень просто: метод не возвращающий значения там называется Sub. Это - сокращение от subrutine, ну это же уже точно не соответствует его сегодняшнему статусу(какая нафиг подпрограмма smile ). А называть как-то надо, вот и назвали словом, которое ммммм...не только к ним относится. Со временем вся эта мешанина накапливается, да ещё и кочует через языки и технологии, в результате имеем то, что имеем.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
PashaPash
Дата 9.12.2009, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



diadiavova, особенности названий методов в vb - это проблемы программистов на vb smile Проблема процедур/функций была решена введением слова void еще в C.
В самом .net, на уровне CLR - есть только методы, причем все - неанонимные smile


--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 9.12.2009, 13:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(PashaPash @  9.12.2009,  13:09 Найти цитируемый пост)
Проблема процедур/функций была решена введением слова void еще в C.

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
ДобренькийПапаша
Дата 9.12.2009, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: 3
Всего: 7



Полностью согласен с diadiavova. Разночтения существуют в книгах, подтверждаю)))


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
PashaPash
Дата 9.12.2009, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Цитата(diadiavova @  9.12.2009,  13:13 Найти цитируемый пост)

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

Этот топик появился из-за разночтения в голове у автора курсов интуита smile Вот зачем было писать 
"отличное от 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 секунды
Цитата(ДобренькийПапаша @  9.12.2009,  14:55 Найти цитируемый пост)
Полностью согласен с diadiavova. Разночтения существуют в книгах, подтверждаю))) 

Читай правильные книги smile Это вы еще старой доброй путаницы переводом statement/operator -> оператор/операция не застали....


--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 9.12.2009, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(PashaPash @  9.12.2009,  16:12 Найти цитируемый пост)
Функции в спеке не упоминаются. Т.е. "быть функцией", IMHO, просто так приписано. Получается суровый персказ спеки своими словами. 

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


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Skynin
Дата 9.12.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 1.7.2007
Где: Харьков

Репутация: 0
Всего: 10



Функция - именованый блок кода который что-то возвращает.
Процедура - именованый блок кода который ничего не возвращает, но что-то, где-то изменяет.

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

Для подчеркивания различия этих концепций в функциональном программировании выделяют чистые функции - то есть такие которые ничего не меняют. В С++ - такие методы помечают const. В Ruby - знаком ! (кажется им)

Методы в ООП - названы отдельным словом чтобы подчеркнуть концепцию что - "передача сообщения объекту". То есть что мы не просто вызываем некий блок кода, а конкретного объекта, с данными конкретного объекта. И получается что метод, это такая функция которой первым параметром неявно передается ссылка на объект.

Вариант - функция (не метод), в силу приверженности синтаксису ООП записываемая как метод принадлежащий классу, а не объекту. То есть в который не передается неявная ссылка на объект.

Общим же является понятие - блок кода. И тут появляется вариант - неименованый блок кода.
Оформить его можно по разному. Суть остается та же - передаем параметры. И часть из них - неявные. Как у метода - ссылка на объект, но если оформляем как замыкание, то передаются еще и значения переменных окружения.

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

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

А если язык - объектно-ориентированный, то чтобы запомнилась разница, в спецификации стараются избегать термина функция, а употреблять - метод.

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

Это сообщение отредактировал(а) Skynin - 9.12.2009, 18:47
PM MAIL WWW ICQ Skype GTalk YIM MSN   Вверх
Закрытая темаСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0927 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.