Re[3]: Что такой анонимный метод(функция)?
От: Sinclair Россия https://github.com/evilguest/
Дата: 18.11.19 06:48
Оценка: 5 (2) +1
Здравствуйте, nt2000, Вы писали:

N>правильно ли я понял: функцию вместе с её телом нельзя передавать в параметре (только её заголовок), а вот если её наименование поменять на секретное наименование, то становится возможным передавать в параметре вместе с заголовком и её тело,даже если оно и не существует нигде ?

Нет, неправильно.
Обычные функции имеют имя, по которому к ним обращаются. У них есть и "заголовок", и тело.
Заголовок в данном случае — это сигнатура, которая описывает, что функция принимает, а что — возвращает.
Сигнатуру саму по себе никуда "передать" нельзя.

Давать функции имя нужно в двух случаях:
1. Когда мы хотим использовать её много раз
2. Когда мы хотим задокументировать её назначение.

Вот простой пример:
public static bool IsEven(int i) => { i % 2 == 0;}

....

var even = from n in numbers where IsEven(n) select n;


Здесь мы определили функцию по имени IsEven. Её сигнатура — Func<int, bool>. Её тело — {return i % 2 == 0;}.

В нашем коде эта функция нужна ровно один раз; поэтому замусоривать ею пространство имён — не очень хорошо.
Поэтому мы можем её никак не называть — можно сконструировать её прямо по месту использования:
var even = from n in numbers where n % 2 == 0 select n;

Здесь плохо видно, где заканчивается where и где начинается функция, поэтому можно задать её чуть более явно (по-прежнему оставив её без имени):
var even = numbers.Where((int n)=>{n % 2 == 0});

Тело вполне себе существует; "секретное наименование" тут неважно — это просто подкапотная реализация семантики, заданной спецификацией.
Просто язык позволяет разделить имя функции и ссылку на неё.
То есть мы можем делать в любом порядке — сначала сконструировать именованную функцию, а потом взять на неё ссылку и передать туда, где ждут ссылку на функцию:
var even = numbers.Where(IsEven); // это функция из первого примера

А можем сначала сконструировать функцию, а потом дать имя ссылке на неё:
Func<int, bool> isEven = (n)=>{n % 2 == 0}); // справа - анонимная функция, слева - именованная переменная типа "делегат"
var even = numbers.Where(isEven);

Особенность тут — в том, что без анонимности любой код обязан быть членом класса. То есть можно писать методы, можно — аксессоры свойств, а вот для "просто кусок кода с параметрами" в хардкорных ОО-языках конструкций нету.

Конструкции типа linq во многом опираются на такие вот простые кирпичики без повторной используемости, заставлять программиста выписывать отдльно все декларации всех участвующих "кусков кода" — оверкилл. Код теряет читаемость.
Вот для её сохранения и приделали анонимные функции в C#.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Что такой анонимный метод(функция)?
От: alexzzzz  
Дата: 15.11.19 11:53
Оценка: 3 (1) +1
Здравствуйте, nt2000, Вы писали:

N>Пишут что это функция без названия. И что из этого следует?


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

var array = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

var odds = array.Where(number => (number % 2) != 0);
var evens = array.Where(delegate(int number) { return (number % 2) == 0; });
Re[4]: Что такой анонимный метод(функция)?
От: alexzzzz  
Дата: 18.11.19 11:34
Оценка: 3 (1) +1
Здравствуйте, Sinclair, Вы писали:

S>Вот простой пример:

S>
S>public static bool IsEven(int i) => { i % 2 == 0;}
S>....
S>var even = from n in numbers where IsEven(n) select n; 
S>

S>Здесь мы определили функцию по имени IsEven. Её сигнатура — Func<int, bool>. Её тело — {return i % 2 == 0;}.

Исключительно занудства ради, с целью лишь бы придраться:
1) Сигнатура функции (т.е. имя и список типов параметров) — IsEven(int)
2) Func<int, bool> — это тип делегата, к которому будет приведён "method group" IsEven в месте его использования.
Отредактировано 18.11.2019 11:36 alexzzzz . Предыдущая версия . Еще …
Отредактировано 18.11.2019 11:35 alexzzzz . Предыдущая версия .
Re: Что такой анонимный метод(функция)?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 13.11.19 09:06
Оценка: 3 (1)
Здравствуйте, nt2000, Вы писали:

N>Пишут что это функция без названия. И что из этого следует? Тогда, что можно назвать любой кусок кода назвать что это не кусок кода а анонимная функцин, там просто нет названия?

N>И передавать в параметре нельзя прости команды(выражения), чем делать тоже самое но называть их телом функции ?
https://itvdn.com/ru/blog/article/closing-in-csharp
и солнце б утром не вставало, когда бы не было меня
Re: Что такой анонимный метод(функция)?
От: vmpire Россия  
Дата: 13.11.19 09:09
Оценка: 3 (1)
Здравствуйте, nt2000, Вы писали:

N>Пишут что это функция без названия. И что из этого следует?

Ничего, это просто определение.

N>Тогда, что можно назвать любой кусок кода назвать что это не кусок кода а анонимная функцин, там просто нет названия?

Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция

Вот тут про анонимные функции в C#, например: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/anonymous-functions
Re[3]: Что такой анонимный метод(функция)?
От: vmpire Россия  
Дата: 15.11.19 10:47
Оценка: 3 (1)
Здравствуйте, nt2000, Вы писали:

V>>Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция

N>почему?
У описания функции есть как минимум список аргументов и логика их преобразования в выходное значеное. Здесь их нет.
Если совсем непонятно — в С#, например, у функции есть либо скобочки () либо стрелочка =>

V>>Вот тут про анонимные функции в C#, например: https://docs.micros...

N>читал уже и не раз..
И какая именно фраза непонятна?
Re[4]: Что такой анонимный метод(функция)?
От: alexzzzz  
Дата: 15.11.19 11:39
Оценка: 3 (1)
Здравствуйте, vmpire, Вы писали:

V>Если совсем непонятно — в С#, например, у функции есть либо скобочки () либо стрелочка =>


или нету:

Func<int, string> f = delegate { return "Hello, World!"; };
Console.WriteLine(f(42));
Re[3]: Что такой анонимный метод(функция)?
От: Silver_S Ниоткуда  
Дата: 15.11.19 12:03
Оценка: 3 (1)
Здравствуйте, nt2000, Вы писали:

V>>Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция

N>почему?

Функцию(указатель) можно передать как параметр в другую функцию. Анонимные функции нужны только для этого.
Re: Что такой анонимный метод(функция)?
От: sergeya Ниоткуда http://blogtani.ru
Дата: 16.11.19 11:11
Оценка: 3 (1)
Здравствуйте, nt2000, Вы писали:

N>Пишут что это функция без названия. И что из этого следует? Тогда, что можно назвать любой кусок кода назвать что это не кусок кода а анонимная функцин, там просто нет названия?


Найди определение функции и добавь туда "без названия".


N>И передавать в параметре нельзя прости команды(выражения), чем делать тоже самое но называть их телом функции ?


Это вопрос синтаксиса. Вызов может выглядеть так, как будто передаешь просто команду, но под капотом будет создана и передана функция (или выражение).
Мобильная версия сайта RSDN — http://rsdn.org/forum/rsdn/6938747
Автор: sergeya
Дата: 19.10.17
Re[4]: Что такой анонимный метод(функция)?
От: Somescout  
Дата: 16.11.19 16:39
Оценка: 3 (1)
Здравствуйте, Silver_S, Вы писали:

V>>>Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция

N>>почему?

S_S> Функцию(указатель) можно передать как параметр в другую функцию. Анонимные функции нужны только для этого.

Как минимум подписка на события (самый частый вариант)
connection.OnWriteRow += (sender, e) => { Console.WriteLine(e.Word); };

Хранение в хэше (редко, но может быть полезно)
var funcs = new Dictionary<string, Action>();
...
funcs['test'] = () => { Console.WriteLine("test"); };
...
funcs['test']();

Возврат функции, в конце-концов (хотя я так никогда не делал)
private Action GetAction() {
  return () =>  { Console.WriteLine("test"); };
}

...

GetAction()();


Наверняка ещё какие-нибудь варианты есть.
ARI ARI ARI... Arrivederci!
Re[5]: Что такой анонимный метод(функция)?
От: Ночной Смотрящий Россия  
Дата: 16.11.19 21:07
Оценка: 3 (1)
Здравствуйте, Somescout, Вы писали:

S>> Функцию(указатель) можно передать как параметр в другую функцию. Анонимные функции нужны только для этого.

S>Как минимум подписка на события (самый частый вариант)
S>
connection.OnWriteRow += (sender, e) => { Console.WriteLine(e.Word); };


Это не анонимная функция, это лямбда.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[6]: Что такой анонимный метод(функция)?
От: Somescout  
Дата: 16.11.19 21:37
Оценка: 3 (1)
Здравствуйте, Ночной Смотрящий, Вы писали:

S>>> Функцию(указатель) можно передать как параметр в другую функцию. Анонимные функции нужны только для этого.

S>>Как минимум подписка на события (самый частый вариант)
S>>
connection.OnWriteRow += (sender, e) => { Console.WriteLine(e.Word); };


НС>Это не анонимная функция, это лямбда.


Что-то я сходу не нахожу разницу, особенно в C#. MS тоже не видит разницы:

You can use a lambda expression or an anonymous method to create an anonymous function.

ARI ARI ARI... Arrivederci!
Re[7]: Что такой анонимный метод(функция)?
От: Ночной Смотрящий Россия  
Дата: 17.11.19 08:25
Оценка: 3 (1)
Здравствуйте, Somescout, Вы писали:

НС>>Это не анонимная функция, это лямбда.

S>Что-то я сходу не нахожу разницу

Разница в синтаксисе.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[5]: Что такой анонимный метод(функция)?
От: varenikAA  
Дата: 18.11.19 02:19
Оценка: 3 (1)
Здравствуйте, nt2000, Вы писали:

N>Раз анон.ф-ия есть ф-ия без заголовка то есть только тело ф-ии читай кусок кода

N>тогда почему бы не "..передать как параметр в другую функцию.." просто кусок кода?

Думаю, нельзя только потому, что это ограничение компилятора C#.
Он просто не может это распарсить.
Если же использовать что-то более функциональное, то запрашиваемое вами поведение возможно
и даже используется очень активно.
Для простоты можете посмотреть на примеры Nemerle (github grokking).
Чутm посложнее — F# или clojure.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[5]: Что такой анонимный метод(функция)?
От: Silver_S Ниоткуда  
Дата: 18.11.19 15:07
Оценка: 3 (1)
Здравствуйте, nt2000, Вы писали:

N>анон.ф-ия === ф-ия без заголовка === только тело ф-ии === кусок кода

N>Раз анон.ф-ия есть ф-ия без заголовка то есть только тело ф-ии читай кусок кода
N>тогда почему бы не "..передать как параметр в другую функцию.." просто кусок кода?

А как предлагаешь в такую функцию передавать кусок кода?:
static void Func(Action a)
{
    a();
}



Func( Console.WriteLine("1"); Console.WriteLine("2"); ); //Так были бы проблемы, противоречия в синтаксисе.
Func( {Console.WriteLine("1"); Console.WriteLine("2");} ); //Так тоже были бы проблемы, скорее всего.

//Сейчас можно только так сделать:
Func( delegate{Console.WriteLine("1"); Console.WriteLine("2");} ); 
Func( delegate(){Console.WriteLine("1"); Console.WriteLine("2");} ); 
Func( () => {Console.WriteLine("1"); Console.WriteLine("2");} );


Это и так зоопарк. ИМХО, лучше только один вариант использовать () =>


N>Или всё же это не ф-ия без заголовка, а нечто другое? чё скрываете?! давай-те уже колитесь..


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

Теоретически есть возможность передать в функцию именно код, в виде теста программы или уже откомпилированный и исполнить.
Но если только начал изучать C# то считай — это радикальные хакерские трюки, с большими накладными расходами, и сам C# их не поддерживает.
Отредактировано 18.11.2019 15:44 Silver_S . Предыдущая версия . Еще …
Отредактировано 18.11.2019 15:43 Silver_S . Предыдущая версия .
Отредактировано 18.11.2019 15:08 Silver_S . Предыдущая версия .
Отредактировано 18.11.2019 15:08 Silver_S . Предыдущая версия .
Что такой анонимный метод(функция)?
От: nt2000  
Дата: 13.11.19 08:25
Оценка:
Пишут что это функция без названия. И что из этого следует? Тогда, что можно назвать любой кусок кода назвать что это не кусок кода а анонимная функцин, там просто нет названия?
И передавать в параметре нельзя прости команды(выражения), чем делать тоже самое но называть их телом функции ?
Re[2]: Что такой анонимный метод(функция)?
От: nt2000  
Дата: 14.11.19 18:52
Оценка:
Здравствуйте, vmpire, Вы писали:

V>Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция


почему?


V>Вот тут про анонимные функции в C#, например: https://docs.micros...


читал уже и не раз..
Re[2]: Что такой анонимный метод(функция)?
От: nt2000  
Дата: 14.11.19 18:57
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>https://itvdn.com/ru/blog/article/closing-in-csharp


интересно клосинг или клосуринг..

язык конечно оффигеть. чиновничий концелярит более внятней..)
Re[4]: Что такой анонимный метод(функция)?
От: nt2000  
Дата: 17.11.19 23:16
Оценка:
Здравствуйте, vmpire, Вы писали:

V>>>Вот тут про анонимные функции в C#, например: https://docs.micros...

N>>читал уже и не раз..
V>И какая именно фраза непонятна?

Т.е. значение лямбда-выражения -- это функция, которая может быть применена к какому-то аргументу/аргументам.

Re[4]: Что такой анонимный метод(функция)?
От: nt2000  
Дата: 17.11.19 23:32
Оценка:
Здравствуйте, Silver_S, Вы писали:

S_S>Здравствуйте, nt2000, Вы писали:


V>>>Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция

N>>почему?

S_S> Функцию(указатель) можно передать как параметр в другую функцию. Анонимные функции нужны только для этого.


Nу?..
анон.ф-ия === ф-ия без заголовка === только тело ф-ии === кусок кода

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

Или всё же это не ф-ия без заголовка, а нечто другое? чё скрываете?! давай-те уже колитесь..
Re[2]: Что такой анонимный метод(функция)?
От: nt2000  
Дата: 17.11.19 23:53
Оценка:
Здравствуйте, sergeya, Вы писали:

S>Найди определение функции и добавь туда "без названия".


а-а-а-а... всё-таки есть название значит.. но это надеюсь не шилонамыло?

N>>И передавать в параметре нельзя прости команды(выражения), чем делать тоже самое но называть их телом функции ?


S>Это вопрос синтаксиса. Вызов может выглядеть так, как будто передаешь просто команду, но под капотом будет создана и передана функция (или выражение).


правильно ли я понял: функцию вместе с её телом нельзя передавать в параметре (только её заголовок), а вот если её наименование поменять на секретное наименование, то становится возможным передавать в параметре вместе с заголовком и её тело,даже если оно и не существует нигде ?

Или только если не существует нигде? Можно ли передавать существующую функцию передатъ таким образом?
Re[5]: Что такой анонимный метод(функция)?
От: vmpire Россия  
Дата: 18.11.19 10:19
Оценка:
Здравствуйте, nt2000, Вы писали:

V>>>>Вот тут про анонимные функции в C#, например: https://docs.micros...

N>>>читал уже и не раз..
V>>И какая именно фраза непонятна?

N>

Т.е. значение лямбда-выражения -- это функция, которая может быть применена к какому-то аргументу/аргументам.

Что-то я не нашёл этой фразы по указанной ссылке.
Сомневаюсь, что это было в официальной документации MS, так как это утверждение не верно.
Лямбда-выражение — это не функция. Это именно лямбда-выражение, отдельная сущность языка.
В некоторых случаях (например, присваивание делегату) она может быть автоматически сконвертирована в анонимную функцию (указатель на которую и присвоится делегату).
В других случаях (например, присваивание переменной типа Expression<>) оно будет сконвертировано в синтаксическое дерево этого выражения, с которым потом можно проводить дальнейшие действия.
Re[4]: СПАСИБО. Такое разжёвывание дорогого стоит.
От: nt2000  
Дата: 18.11.19 16:01
Оценка:
Здравствуйте, Sinclair, Вы писали:
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.