一般来说,C#在大众语言运行时(CLR)环境中系统为我们内置了一些常用的委托,包孕Action类的委托、Func类的委托、Predicate<T>委托、Comparison<T>委托等等。以上这些委托的定名空间都是System,所属措施集都是 mscorlib.dll,今天本文就来讲一讲这些委托的使用要领。
就像我们本身已界说好的一样,,要实现某些成果,我们可以直接操作系统内置委托,实例化它们,而不必显式界说一个新委托并将定名要领分配给该委托。如:
public static void Test() { Console.WriteLine("Just For Test"); } static void Main(string[] args) { Action a = new Action(Test); //直接实例化一个Action委托,不用本身再界说新委托 a(); }
只要了解了该系统内置委托是干什么的,传什么参数,返回什么值,大家就可以仿上述例子自行挪用,不再赘述。下面是我对这四类委托的总结,并附有结合匿名要领与Lambda表达式的典型,两种要领实现的功效一样,大家可触类旁通,灵活运用。
一、Action类的委托
1.Action委托 封装一个要领,该要领不具有参数并且不返回值
2.Action<T>委托 封装一个要领,该要领只有一个参数并且不返回值
3.Action<T1,T2>委托 封装一个要领,该要领具有两个参数并且不返回值
…… ……
17.Action<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16>委托 封装一个要领,该要领具有16个参数并且不返回值
下面以Action<T>委托为例,示范如何使用Action类的委托,该类委托仅仅是参数个数上有区别而已。
static void Main(string[] args) { #region Action<T>委托示例 //需求:打印出整型调集list的元素 List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; //将匿名要领分配给 Action<T> 委托实例 Action<int> concat1 = delegate(int i) { Console.WriteLine(i); }; list.ForEach(concat1); //将 lambda 表达式分配给 Action<T> 委托实例 Action<int> concat2 = (i => Console.WriteLine(i)); list.ForEach(concat2); Console.ReadKey(); #endregion }
总结:
Action类的委托最少可以传入0个参数,最多可以传入16个参数,参数类型皆为逆变,并且不返回值。
二、Func类的委托
1.Func(TResult)委托封装封装一个不具有参数但却返回 TResult 参数指定的类型值的要领
2.Func(T,TResult)委托 封装一个具有一个参数并返回 TResult 参数指定的类型值的要领
3.Func(T1,T2,TResult)委托 封装一个具有两个参数并返回 TResult 参数指定的类型值的要领
…… ……
17.Func<T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15,T16,TResult>委托 封装一个要领,该要领具有16个参数,并返回TResult参数所指定的类型的值
下面以Func<T,TResult>委托为例,示范如何使用Func类的委托,该类委托仅仅是参数个数上有区别而已。
static void Main(string[] args) { #region Func<T,TResult>委托示例 //需求:查找整型调集list中大于3的所有元素构成的新调集,并打印出调集元素 List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; //将匿名要领分配给 Func<T,TResult> 委托实例 Func<int, bool> concat1 = delegate(int i) { return i > 3; }; var newlist1 = list.Where(concat1).ToList(); //将 Lambda 表达式分配给 Func<T,TResult> 委托实例 Func<int, bool> concat2 = i => i > 3; var newlist2 = list.Where(concat2).ToList(); newlist1.ForEach(i => Console.WriteLine(i.ToString())); newlist2.ForEach(i => Console.WriteLine(i.ToString())); Console.ReadKey(); #endregion }
总结:
Func类的委托最少可以传入输入泛型参数(in,逆变) 1个,最多可以传入输入泛型参数(in,逆变) 16个,传入的输出泛型参数(out,协变)有且只有一个,这个类型是此委托封装的要领的返回值类型。
三、Predicate<T>委托
暗示界说一组条件并确定指定东西是否切合这些条件的要领
下面给出Predicate<T>委托的典型:
static void Main(string[] args) { #region Predicate<T>委托示例 //需求:查找整型调集list中大于3的所有元素构成的新调集,并打印出调集元素 List<int> list = new List<int>() { 1, 2, 3, 4, 5 }; //将匿名要领分配给 Predicate<T> 委托实例 Predicate<int> concat1 = delegate(int i) { return i > 3; }; var newlist1 = list.FindAll(concat1); //将 lambda 表达式分配给 Predicate<T> 委托实例 Predicate<int> concat2 = (c => c > 3); var newlist2 = list.FindAll(concat2); newlist1.ForEach(i => Console.WriteLine(i)); newlist2.ForEach(i => Console.WriteLine(i)); Console.ReadKey(); #endregion }
总结: