就目前的学习进度,可将委托实例视为一个数据元素为函数的数组,执行委托实例就是将里面的函数都执行一遍。
具体使用:
- 先申明一种委托,
public delegate int Comparison<in T>(T x, T y);
那我们将得到一种类型(泛型类型)Comparison
- 得到委托泛型实例,
public Comparison<T> comparator;
我们将得到一个委托实例comparator。 - 往委托实例里面增加函数,可以直接赋值
Comparison<string> comparer = (left, right) => left.Length.CompareTo(right.Length);
,也可以增加:Comparison<string> comparer += (left, right) => left.Length.CompareTo(right.Length);
可以看到,最终我们经历了申明委托类型 -> 得到委托实例 才得到一个实际可用的委托。其中申明委托类型 实际上就是申明参数列表,如果考虑泛型的话,实际上就是申明输入,输出的参数个数。
所以,申明委托类型这部分,.Net提供了一点小小的帮助,.Net提供了Action、Func、Predicate三种内置委托类型申明
Action ,Action最重要的一点:返回值为void。
其申明为public delegate void Action();
这个是没有输入参数的。还提供其他输入参数个数的,1,2,3,4直到16个,其申明如下😂:
public delegate void Action<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,in T16>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
所以超过17个类型就需要自己申明委托类型了,一般人也用不到这么多。Func,Func最重要的一点:带有一个返回值,无输入参数申明:
public delegate TResult Func<out TResult>();
。
最多16个输入,1个输出:
public delegate TResult Func<in T1,in T2,in T3,in T4,in T5,in T6,in T7,in T8,in T9,in T10,in T11,in T12,in T13,in T14,in T15,in T16,out TResult>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9, T10 arg10, T11 arg11, T12 arg12, T13 arg13, T14 arg14, T15 arg15, T16 arg16);
Predicate,Predicate最重要的一点:返回值为bool,仅一个申明形式:
public delegate bool Predicate<in T>(T obj);