powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
12 сообщений из 12, страница 1 из 1
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784142
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот в дотнете есть куча определений уже готовых делегатов, типа семейства типов Func. Я хочу написать функцию, которая итеративно применяется для последовательности значений, причём на вход получает значение из этой последовательности и некую константу, а возвращает результат вычислений. Для такой цели подойдёт тип делегата Func<T1, T2, TResult>. Один минус - этот тип определяется так

Код: c#
1.
2.
3.
public delegate TResult Func<in T1, in T2, out TResult>(
	T1 arg1,
	T2 arg2



Т. е. с ничего не говорящими названиями аргументов. А мне надо, чтобы аргументы назывались так, как мне хочется. Например, value и constant. Я могу объявить свой тип делегата, но получается, что только из-за того, что мне каждый раз нужны свои названия аргументов, я должен постоянно объявлять типы делегатов, имеющих одну сигнатуру.

Можно это как-то обойти? Скажем, назначать названия аргументам при создании делегата.

Я создаю делегат, например, так:

Код: c#
1.
Func<double, double> _calc = (value, constant) => value / constant;



Но вот этих названий - value и constant - тот, кто вызывает этот делегат, не видит. Он видит arg1 и arg2, причём без комментариев, что какой аргумент означает.

А я хочу, чтобы можно было свои названия делать и комментарии к ним.
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784254
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

не совсем понятно чего хочешь добиться
если метод известен то и напиши его:
Код: c#
1.
2.
3.
4.
double _calc(double value, double constant)
{
   return value / constant;
}


если нет то причём тут названия аргументов?

ЗЫ код не компилится
Код: c#
1.
Func<double, double> _calc = (value, constant) => value / constant;
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784262
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationЗЫ код не компилится
Код: c#
1.
Func<double, double> _calc = (value, constant) => value / constant;


Надо так

Func<double, double, double> _calc = (value, constant) => value / constant;
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784265
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320 А я хочу, чтобы можно было свои названия делать и комментарии к ним.
тогда
user7320должен постоянно объявлять типы делегатов

чудес не будет.

_calc = (v, c) => v / c;
и что бедной среде делать показывать?
что окажется в _calc только при исполнении известно станет
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784266
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320Я хочу написать функцию, которая итеративно применяется для последовательности значений, причём на вход получает значение из этой последовательности и некую константу, а возвращает результат вычислений.
LINQ, Aggregate
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784276
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

заканчивай изобретать велосипеды
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784303
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pationuser7320,

не совсем понятно чего хочешь добиться
если метод известен то и напиши его:
Код: c#
1.
2.
3.
4.
double _calc(double value, double constant)
{
   return value / constant;
}


если нет то причём тут названия аргументов?
Тогда так. Немного другой контекст - без константы.

Имеем расширяющий метод, принимающий экземпляр делегата и работающий с двумя смежными значениями из последовательности:

Код: c#
1.
2.
3.
4.
public static IEnumerable<TResult> SelectWithPrevious<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TSource, TResult> projection)
{
    //...
}


Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
public static IEnumerable<TResult> SelectWithPrevious<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TSource, TResult> projection)
{
    IComparer<TSource> comparer = Comparer<TSource>.Default;
    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            yield break;
        }

        TSource previous = iterator.Current;

        while (iterator.MoveNext())
        {
            yield return projection(previous, iterator.Current);
            previous = iterator.Current;
        }
    }
}


Как дать понять, что в

Код: c#
1.
Func<TSource, TSource, TResult> projection



первый параметр - это previous (предыдущий элемент, смежный слева), а второй - это current (текущий элемент, смежный справа)?

Вот вызываю я этот метод для последовательности, и в качестве параметра мне подсвечивается

Код: c#
1.
Func<TSource, TSource, TResult> projection



И если вы передадите в качестве параметра метод

Код: c#
1.
2.
3.
4.
double Calc(double previous, double current)
{
    return current - previous;
}



то будет один результат,

а если метод

Код: c#
1.
2.
3.
4.
double Calc(double current, double previous)
{
    return current - previous;
}



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

Тут нало либо писать свой тип делегата, где будут аргументы именованы как мне надо, или что? Если свой тип делегата, то он будет по сигнатуре повторять уже объявленные Func<TSource, TSource, TResult>. Это нормально? Может, есть способ пояснить назначение аргументов для уже объявленных типов делегатов, типа Func<TSource, TSource, TResult>?
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784314
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320то будет другой результат - из-за того, что в этом случае важен порядок передачи параметров в метод.
...потому что в моём расширяющем методе параметры в метод передаются в определённом порядке.
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784354
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем, подписал к комментариям к этому расширяющему методу, какие параметры у его аргумента projection что должны означать. Ну или свой тип делегата с нужными мне именованием параметров городить.
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784436
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320первый параметр - это previous (предыдущий элемент, смежный слева), а второй - это current (текущий элемент, смежный справа)?
для этого комментарии есть
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38784874
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,

название аргументов могут быть совершенно любыми, идентификация идёт не по имени , а по сигнатуре.
то есть по типам и порядку следования этих аргументов
...
Рейтинг: 0 / 0
Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
    #38786628
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320,
Радуйся что хоть так :)
В F# например вообще такие конструкции
Код: c#
1.
let apply2 ( f: int -> int -> int) x y = f x y


из которых он сам выводит типы в том числе и функций.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как дать осмысленные имена аргументам встроенных делегатов или зачем нужны Func и т. п.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]