微软给我们封装了许多的委托方法,例如Func,Action,Perdicate等,在工作学习中这些委托也足够我们使用了
Func委托
什么是Func委托
Func委托代表有返回类型的委托
Func委托定义
using System.Runtime.CompilerServices;namespace System{//// 摘要:// 封装一个方法,该方法具有两个参数,并返回由 TResult 参数指定的类型的值。//// 参数:// arg1:// 此委托封装的方法的第一个参数。//// arg2:// 此委托封装的方法的第二个参数。//// 类型参数:// T1:// 此委托封装的方法的第一个参数的类型。//// T2:// 此委托封装的方法的第二个参数的类型。//// TResult:// 此委托封装的方法的返回值类型。//// 返回结果:// 此委托封装的方法的返回值。[TypeForwardedFrom(\"System.Core, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089\")]public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);}public delegate TResult Func<out TResult>();public delegate TResult Func<in T,out TResult>(T1 arg1);public delegate TResult Func<in T1,in T2,...,in T16, out TResult>(T1 arg1, ..., T2 arg2) ;
Func泛型委托引用了一个带有一个返回值的方法,它可以传递0或者多到16个参数类型,和一个返回类型。
它可以没有传递参数,但是一定要有返回类型。
Func的基本使用
求两个数相加,定义一个方法,直接调用
class Program{static void Main(string[] args){//【1】调用Add方法使用double result = Add(10, 20);Console.WriteLine(result);//【2】使用FuncFunc<int, int, double> func1 = Add;Console.WriteLine(func1(10, 20));//【3】使用Func+Lambda,省略方法Func<int, int, double> func2 = (a, b) => a + b;Console.WriteLine(func2(10, 20));Console.ReadLine();}static double Add(int a, int b){return a + b;}}
有一个面试题:编写一个方法,从数组的指定位置抽取连续的几个数,求和,求积。(使用委托)
一般是编写两个求和求积的方法
可以抽取方法中的变化的相乘、相加,封装不变的代码
class Program{static void Main(string[] args){int[] nums = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };int result1 = GetSum(nums, 0, 3);int result2 = GetMultipy(nums, 0, 3);int result3 = GetResult((a, b) => a + b, nums, 0, 3);int result4 = GetResult((a, b) => a * b, nums, 0, 3);Console.WriteLine(result1);Console.WriteLine(result2);Console.WriteLine(result3);Console.WriteLine(result4);Console.ReadLine();}//求和static int GetSum(int[] nums, int from, int to){int result = 0;for (int i = from; i <= to; i++){result += nums[i];}return result;}//求积static int GetMultipy(int[] nums, int from, int to){int result = 1;for (int i = from; i <= to; i++){result *= nums[i];}return result;}//使用Func委托static int GetResult(Func<int, int, int> func, int[] nums, int from, int to){int result = nums[from];for (int i = from + 1; i <= to; i++){result = func(result, nums[i]);}return result;}}
Action委托
什么是Action委托
Action委托代表无返回值的委托
常应用于:跨线程访问可视化控件
Action委托定义
public delegate Action<in T>;public delegate Action<in T1,in T2,...,in T16> ;
Action委托基本使用
class Program{static void Main(string[] args){Action<string> action = a => Console.WriteLine(\"你好,{0}!\", a);action(\"Action委托\");Console.ReadLine();}}
Predicate委托
Predicate委托基本介绍
表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。
此委托返回一个bool值的方法
public delegate bool Predicate<in T>(T obj);
List中的FindAll()
Predicate委托基本使用
class Program{static void Main(string[] args){List<Product> list = new List<Product>(){new Product(){ProductId = 0001,ProductName = \"百事可乐\"},new Product(){ProductId = 0002,ProductName = \"可口可乐\"},new Product(){ProductId = 0003,ProductName = \"薯片\"},new Product(){ProductId = 0004,ProductName = \"辣条\"},new Product(){ProductId = 0005,ProductName = \"饼干\"}};//使用Linq也可以List<Product> list2 = list.FindAll(p => p.ProductId > 0002);foreach (var item in list2){Console.WriteLine(item.ProductId + \":\" + item.ProductName);}Console.ReadLine();}}