系统内置的委托
使用委托:方法的签名要和委托一致。
1.System.Func 代表有返回类型的委托|--public delegate TResult Func<out TResult>();
|--public delegate TResult Func<in T,out TResult>(T tag);
注:输入泛型参数-in最多16个,输出泛型桉树-out只有一个
2.System.Action 代表 ,无返回值的委托 public delegate void Delegate();
3.System.Predicate<T> 代表返回bool类型的委托,用作执行表达式
public delegate bool Predicate<in T>(T obj);
4.System.Comparison<T> 代表返回int类型的委托 --用作比较两个参数的大小
1.Action无返回值的委托
static void Delegate_Action()
{
List<Person> plist = GetPersonList();
//传统的foreach遍历
// plist.ForEach(fe);
//plist.ForEach(delegate(Person p) { Console.WriteLine(p.Name); });
//plist.ForEach((Person p) => { Console.WriteLine(p.Name); });
plist.ForEach(p => Console.WriteLine(p.Name));
}
static void fe(Person p)
{
//无返回值 就是逻辑代码处理咯
Console.WriteLine(p.Name);
}
2.Func有返回值的委托
static void Delegate_Func()
{
var plist = GetPersonList();
//plist.Where(c => c.Age > 30);
//输入一个泛型 Person的,一个输出的bool值
//plist.Where(Func<Person,bool>(Person p))
plist.Where(delegate(Person p) { return p.Age > 30; });
plist.Where(p => p.Age > 30).ToList().ForEach(c => Console.WriteLine(c.Age));
}
3.Predicate 返回bool类型的委托,用作执行表达式。
static void Delegate_Predicate()
{
List<Person> plist = GetPersonList();
//1.0 查询年龄大于30岁的人员信息
//转到定义看参数描述public delegate bool Predicate<in T>(T obj);
plist.FindAll(Query);
//1.0.1 演变 利用匿名委托来代替自定义方法query
plist.FindAll(delegate(Person p) { return p.Age > 30; });
//1.0.2 演变 匿名委托很多东西都可以神略掉 delegate省略()里面参数列表,如果没有 括号也不可省略,=> { 方法体 }
plist.FindAll((Person p) => { return p.Age > 30; }); // => goes to 分隔符
//1.0.3 演变->lambda表达式 括号、return 都去掉,只留一个参数名字和方法体内容即可
plist.FindAll(p => p.Age > 30); //p就是形参名了 编译器根据FindAll来推理到pList集合中,那么p就是Person对象了
}