Я предполагаю, что ваш вопрос касается c #, а не .NET, из-за неоднозначности вашего вопроса, так как .NET не остается в одиночестве, то есть без c # - понимания делегатов и лямбда-выражений.
A ( normal , в отличие от так называемых универсальных делегатов, cf позже) делегата следует рассматривать как разновидность c ++ typedef
тип указателя на функцию, например в c ++:
R (*thefunctionpointer) ( T ) ;
typedef - это тип thefunctionpointer
, который является типом указателей на функцию, принимающую объект типа T
и возвращающий объект типа R
. Вы бы использовали это так:
thefunctionpointer = &thefunction ;
R r = (*thefunctionpointer) ( t ) ; // where t is of type T
, где thefunction
- функция, принимающая T
и возвращающая R
.
В c # вы бы пошли на
delegate R thedelegate( T t ) ; // and yes, here the identifier t is needed
и вы бы использовали его так:
thedelegate thedel = thefunction ;
R r = thedel ( t ) ; // where t is of type T
где thefunction
- функция, принимающая T
и возвращающая R
. Это для делегатов, так называемых обычных делегатов.
Теперь у вас также есть обобщенные делегаты в c #, которые являются обобщенными делегатами, , т.е. , которые, так сказать, «шаблонизированы», используя, таким образом, выражение c ++. Они определены так:
public delegate TResult Func<in T, out TResult>(T arg);
И вы можете использовать их так:
Func<double, double> thefunctor = thefunction2; // call it a functor because it is
// really as a functor that you should
// "see" it
double y = thefunctor(2.0);
, где thefunction2
- функция, принимающая в качестве аргумента и возвращающая double
.
Теперь представьте, что вместо thefunction2
я хотел бы использовать «функцию», которая пока нигде не определена оператором, и которую я никогда не буду использовать позже. Тогда c # позволяет нам использовать выражение этой функции. Под выражением я подразумеваю его «математическое» (или функциональное, чтобы придерживаться программ) выражение, например: double x
я буду ассоциировать double
x*x
. В математике вы пишете это, используя латексный символ "\ mapsto" . В c # функциональная запись была заимствована: =>
. Например:
Func<double, double> thefunctor = ( (double x) => x * x ); // outer brackets are not
// mandatory
(double x) => x * x
- это выражение . Это не тип, тогда как делегаты (общие или нет).
Мораль? В конце концов, что такое делегат (соответственно универсальный делегат), если не тип указателя функции (соответственно упакованный + умный + тип указателя универсальной функции), а? Что-то другое ! См. это и это .