什么是委托
委托可以把一个方法作为参数带入另一个方法,可以理解为指向一个函数的指针
委托是一种类型,可以指向一个或多个方法,调用委托变量时执行的就是变量指向的方法
委托的原生用法
1、定义委托
.NET中定义了泛型委托Action(无返回值)和Func(有返回值),所以一般不需要自定义委托类型。
delegate void Del(int x);
2、实例化委托
又叫订阅委托。订阅委托有多种方法
//方法一:直接new一个委托
Del d1 = new Del(DoWork);
//方法二:将自定义方法赋值给委托
Del d2 = DoWork;
//方法三:通过匿名方法
Del d4 = delegate (int y) {
DoWork(y);
};
DoWork、DoWork2是自定义方法
void DoWork(int x) {
lblResult.Text= "成功调用";
}
void DoWork2(int x) {
lblResult.ForeColor = Color.Green;
}
3、调用委托
d1(1);
委托的多播
通过“+=”运算符将多个方法对象分配到一个委托实例上,形成多播委托
注意不能一开始就用+=,必须先用=赋值,才能使用+=
Del d3= DoWork;
d3 += DoWork2;
委托指向匿名方法
委托变量不仅可以指向普通方法,还可以指向匿名方法
//Func泛型最后一个参数代表返回值类型,前面的代表参数类型
Func<int, int, string> f1 = delegate (int x, int y)
{
return $"{x}+{y}={x + y}";
};
//调用
string s=f1(1,2);
Action f1 = delegate ()
{
Console.WriteLine("haha");
};
//调用
f1();
委托指向lambda表达式
因为匿名方法可以写成lambda表达式,所以可以省略参数数据类型,编译器能够根据委托类型推断出参数类型
Func<int, int, string> f1 = (x, y) => {
return $"{x}+{y}={x + y}";
};
如果委托的方法体只有一行代码,且无返回值,可省略花括号{ }
Action<int, string> people = (age, name) =>
Console.WriteLine($"年龄{age},姓名{name}");
如果委托的方法体只有一行代码,且有返回值,可省略花括号{ }和return
Func<int, int, string> f1 = (x, y) =>
$"{x}+{y}={x + y}";
如果委托只有一个参数,参数的小括号()可以省略
Action<string> f1=s=>Console.WriteLine(s);
Func<int, bool> f2 = i => i > 5;
匿名方法
没有函数名,只有delegate关键字+主体,只能通过委托调用
委托和事件的区别
委托的本质,是一个类。而事件,是一个委托类型的私有变量加上两个公有方法(事件的+=和-=),这是本质区别。事件里面其实就两个方法(即add_event()和remove_event())。这两个方法里面分别是对这个私有的委托变量进行的合并和移除,当调用事件的+=时其实是调用的事件里面的add_event()方法,同样-=调用的是remove_event()方法。
事件是委托的封装,可以理解为一种特殊的委托。