一、委托 :Delegate
1、委托是一个类,同时也是数据类型,一种引用类型,可用于存储、传递方法。
2、主要的意义在于将变化的方法封装起来。
3、讲白了,就是为了解决一个方法作为参数传到另一个方法中的问题而来的,让方法灵活。
使用:
步骤分为三步:
1、定义委托类型
2、声明委托变量,并赋值
3、调用委托
//1.定义委托类型
//定义一个委托类型,用来保存无参数,无返回值的方法
//定义了一个名字为MyDelegate的类型,并且这个类型是个委托而且只能存储没有返回值,没有参数的方法
//委托要定义在命名空间 , 和类是同一级别'
public delegate void MyDelegate();
//泛型委托
public delegate void my<T>(T scr);
static void Main(string[] args)
{
//2.使用委托的第二步:声明委托变量,并赋值
//声明了一个委托变量md,并且new了一个委托对象,并且把方法M1传递进去
//即md为多保存了M1方法'
MyDelegate md = new MyDelegate(M1);
//3.调用md委托的时候就相当于调用了M1方法'
md();
Console.WriteLine("OK");
Console.ReadKey();
}
static void M1()
{
Console.WriteLine("这是一个没有返回值没有参数的方法");
}
}
我们会发现,如果我们频繁使用委托,就会大量的去先定义委托类型,会比较的麻烦。所以微软很贴心的加了两个关键词:Action 、 Func 和 Predicate,这两个委托类型区别在于有无返回值。
关于Action:
Action可以接受0到16个参数传入,但是没有返回值 例如:Action<T>
static void Main(string[] args)
{
//Action 可以传入0-16个参数,无返回值
Action<int, int> actionDel = new Action<int, int>(AddInstance_Action);
actionDel(6 , 8);
}
public static void AddInstance_Action(int a , int b)
{
Console.WriteLine(a + b);
}
关于Func:
Func可以接受1到16个参数传入,必须有返回值,参数最后一个为返回值,在只有一个参数时,为返回值。 例如:Func<T , out TResult>
static void Main(string[] args)
{
//Func 可以传入0-16个参数,必须有返回值,最后一个为返回值,必须有
Func<int, int> funcDel = new Func<int, int>(AddInstance_Func);
Console.WriteLine(funcDel(6));
}
public static int AddInstance_Func(int a)
{
return a + 3;
}
关于Predicate:
Predicate是返回bool型的泛型委托,Predicate有且只有一个参数,返回值固定为bool。表示定义一组条件并确定指定对象是否符合这些条件的方法。此方法常在集合(Array 和 List<T>)的查找中被用到,如:数组,正则拼配的结果集中被用到。
我们以数组中的FindAll方法为例
int[] arr = new int[]
{
4,6,90,6,8,3,1
};
int [] resultArr = Array.FindAll(arr , CompareInt);//参数CompareInt即是一个Predicate,在具体的执行中,每一个数组的元素都会执行指定的方法,如果满足要求返回true,并会被存放在结果集中,不符合的则被剔除,最终返回的集合,即是结果判断后想要的集合。
foreach (var item in resultArr)
{
Console.WriteLine(item.ToString());
}
private static bool CompareInt(int a)
{
if (a >= 4)
{
return true;
}
return false;
}
二、lambda表达式
lambda表达式是一种匿名函数,是高效的编程表达式,它是匿名函数的升级,使得更简化。其与委托使用,更体现出委托对的便利与代码简化。
//定义委托类型
public delegate void MyDelegate();
public delegate void MyDelegate1(string m);
public delegate void MyDelegate2(string m , int n , int k);
public delegate string MyDelegate3(string m);
//声明委托,并赋值:
//第一种lambda表达式,没有参数没有返回值;
MyDelegate md = () =>{
Console.WriteLine("lambda表达式,无参无反");
};
//第二种,有参数,没有返回值,
//传的值无需标明类型,因为声明委托时已注明,系统自动识别'
MyDelegate1 md = m =>{
Console.WriteLine("lambda表达式,有参无返");
Console.WriteLine(m);
};
//或者多个参数
MyDelegate2 md = (m , n , k)=>{
Console.WriteLine("lambda表达式,有参无返");
Console.WriteLine(m , n , k);
};
//第三种,有参数,有返回值,
MyDelegate3 md = (m)=>{
Console.WriteLine("lambda表达式,有参有返");
Console.WriteLine(m );
return m;
};
网友评论