Пишут что это функция без названия. И что из этого следует? Тогда, что можно назвать любой кусок кода назвать что это не кусок кода а анонимная функцин, там просто нет названия?
И передавать в параметре нельзя прости команды(выражения), чем делать тоже самое но называть их телом функции ?
Здравствуйте, nt2000, Вы писали:
N>Пишут что это функция без названия. И что из этого следует? Тогда, что можно назвать любой кусок кода назвать что это не кусок кода а анонимная функцин, там просто нет названия? N>И передавать в параметре нельзя прости команды(выражения), чем делать тоже самое но называть их телом функции ? https://itvdn.com/ru/blog/article/closing-in-csharp
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, nt2000, Вы писали:
N>Пишут что это функция без названия. И что из этого следует?
Ничего, это просто определение.
N>Тогда, что можно назвать любой кусок кода назвать что это не кусок кода а анонимная функцин, там просто нет названия?
Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция
Здравствуйте, nt2000, Вы писали:
V>>Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция N>почему?
У описания функции есть как минимум список аргументов и логика их преобразования в выходное значеное. Здесь их нет.
Если совсем непонятно — в С#, например, у функции есть либо скобочки () либо стрелочка =>
V>>Вот тут про анонимные функции в C#, например: https://docs.micros... N>читал уже и не раз..
И какая именно фраза непонятна?
Здравствуйте, nt2000, Вы писали:
N>Пишут что это функция без названия. И что из этого следует? Тогда, что можно назвать любой кусок кода назвать что это не кусок кода а анонимная функцин, там просто нет названия?
Найди определение функции и добавь туда "без названия".
N>И передавать в параметре нельзя прости команды(выражения), чем делать тоже самое но называть их телом функции ?
Это вопрос синтаксиса. Вызов может выглядеть так, как будто передаешь просто команду, но под капотом будет создана и передана функция (или выражение).
Здравствуйте, Silver_S, Вы писали:
V>>>Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция N>>почему?
S_S> Функцию(указатель) можно передать как параметр в другую функцию. Анонимные функции нужны только для этого.
Как минимум подписка на события (самый частый вариант)
Здравствуйте, Somescout, Вы писали:
S>> Функцию(указатель) можно передать как параметр в другую функцию. Анонимные функции нужны только для этого. S>Как минимум подписка на события (самый частый вариант) S>
Здравствуйте, Ночной Смотрящий, Вы писали:
S>>> Функцию(указатель) можно передать как параметр в другую функцию. Анонимные функции нужны только для этого. S>>Как минимум подписка на события (самый частый вариант) S>>
Здравствуйте, vmpire, Вы писали:
V>>>Вот тут про анонимные функции в C#, например: https://docs.micros... N>>читал уже и не раз.. V>И какая именно фраза непонятна?
Т.е. значение лямбда-выражения -- это функция, которая может быть применена к какому-то аргументу/аргументам.
Здравствуйте, Silver_S, Вы писали:
S_S>Здравствуйте, nt2000, Вы писали:
V>>>Нет, "любой кусок кода" не будет функцией. Например { а=а+1; } это не функция N>>почему?
S_S> Функцию(указатель) можно передать как параметр в другую функцию. Анонимные функции нужны только для этого.
Nу?..
анон.ф-ия === ф-ия без заголовка === только тело ф-ии === кусок кода
Раз анон.ф-ия есть ф-ия без заголовка то есть только тело ф-ии читай кусок кода
тогда почему бы не "..передать как параметр в другую функцию.." просто кусок кода?
Или всё же это не ф-ия без заголовка, а нечто другое? чё скрываете?! давай-те уже колитесь..
Здравствуйте, sergeya, Вы писали:
S>Найди определение функции и добавь туда "без названия".
а-а-а-а... всё-таки есть название значит.. но это надеюсь не шилонамыло?
N>>И передавать в параметре нельзя прости команды(выражения), чем делать тоже самое но называть их телом функции ?
S>Это вопрос синтаксиса. Вызов может выглядеть так, как будто передаешь просто команду, но под капотом будет создана и передана функция (или выражение).
правильно ли я понял: функцию вместе с её телом нельзя передавать в параметре (только её заголовок), а вот если её наименование поменять на секретное наименование, то становится возможным передавать в параметре вместе с заголовком и её тело,даже если оно и не существует нигде ?
Или только если не существует нигде? Можно ли передавать существующую функцию передатъ таким образом?
Здравствуйте, nt2000, Вы писали:
N>Раз анон.ф-ия есть ф-ия без заголовка то есть только тело ф-ии читай кусок кода N>тогда почему бы не "..передать как параметр в другую функцию.." просто кусок кода?
Думаю, нельзя только потому, что это ограничение компилятора C#.
Он просто не может это распарсить.
Если же использовать что-то более функциональное, то запрашиваемое вами поведение возможно
и даже используется очень активно.
Для простоты можете посмотреть на примеры Nemerle (github grokking).
Чутm посложнее — F# или clojure.
Здравствуйте, 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#.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, nt2000, Вы писали:
V>>>>Вот тут про анонимные функции в C#, например: https://docs.micros... N>>>читал уже и не раз.. V>>И какая именно фраза непонятна?
N>
Т.е. значение лямбда-выражения -- это функция, которая может быть применена к какому-то аргументу/аргументам.
Что-то я не нашёл этой фразы по указанной ссылке.
Сомневаюсь, что это было в официальной документации MS, так как это утверждение не верно.
Лямбда-выражение — это не функция. Это именно лямбда-выражение, отдельная сущность языка.
В некоторых случаях (например, присваивание делегату) она может быть автоматически сконвертирована в анонимную функцию (указатель на которую и присвоится делегату).
В других случаях (например, присваивание переменной типа Expression<>) оно будет сконвертировано в синтаксическое дерево этого выражения, с которым потом можно проводить дальнейшие действия.
Здравствуйте, 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 в месте его использования.
Здравствуйте, 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# их не поддерживает.