什么是委托
委托是特殊的类。
创建一个委托类
delegate void MyDel();//就是创建一个委托类,它等价于class MyDel{}当然,这里我只是打比方,方便理解。
delegate void MyDel();可以理解为 class MyDel{}
既然是类,那么它就可以在任何地方创建。
实例化一个委托对象
MyDel myDel = new MyDel();//只有类才需要实例化,这个暴露出了委托的本质就是一个特殊的类。
委托内部结构
利用委托的方式是,通过委托实例添加要委托执行的方法,可以添加多个方法,统一执行,那么可以知道,委托类的内部维护了一个方法列表和执行函数。
//需要委托的方法
public void Function1(){}
public void Function2(){}
public void Function3(){}
.....
public void Functionn(){}
//添加到委托类内部列表
myDel +=Function1;
myDel +=Function1;
myDel +=Function1;
myDel +=Function1;
//执行
myDel();
委托就这么简单。
什么是事件
事件,就是一个类需要回调或监听发生了什么。
事件的本质是委托的一个实例
deletegate void MyDel();//创建一个委托类
event MyDel EventDel();//实例化一个委托,可以理解为实例化了一个EventDel对象,
实际上理解为 Myel EventDel = new Myel();因为是实例所以只能在类中声明
event说明
event标识,表示是一个事件,在该事件的什么的类中才能触发该事件,其他类不能触发, 只能添加方法。
案例:
类ClassA
public class ClassA
{
private delegate void MyDel();
public MyDel MyADel;
public event MyDel MyEvent;
public void Action()
{
MyEvent();
}
}
类ClassB
public class ClassB
{
public void ActionA(ClassA classA){
//classA.MyEvent();//这样是错误的,只能在ClassA中调用
classA.MyEvent+=TheB;//这样子是正确的
}
public void DelA(ClassA classA)
{
classA.MyADel += TheB;
classA.MyADel -= TheB;
classA.MyADel();
}
public void TheB()
{
Console.WriteLine("我是在B类中触发的");
}
}
委;托和事件的区别
1.委托是类,事件是委托的实例
2.事件不能new
3委托可以通过构造函数添加方法,事件只能+=和-=管理方法。
4.委托可以在任何地方创建,事件只能在类中创建。
5.事件只能在声明它的类中调用,委托没有这个限制。
委托和事件的应用场景
委托:
1.用于一组具有相同签名的方法的执行。
2.用做方法参数,可以传递。
3.在异步中监听并回调是否执行完成。
事件:
1.用于某个类的某个请求或方法的监听
Action和Func
Action和Func就是为了避免每次都创建委托而产生的共用委托类。
Action
action就是可带参数的委托类,但是没有返回值
例如:下面相等
delegate void MyDel() = Action
delegate void MyDel(string str) = Action<String>
delegate void MyDel(string str1,string str2,...) = Action<string,string,....>
使用案例
Action ac = new Action(MyDel);
ac();//执行
public void MyDel(){
}
Func
func是必须有返回值,并可带参数
例如:下面的相等
delegate string MyDel() = Func<string>
delegate string MyDel(string str) = Func<string,string(该参数为返回值类型)>
delegate string MyDel(string str1,string str2,....,string n) = Func<string ,string,....string(该参数为返回值类型)>
func可以作为参数传递值
使用案例:
Func<string> func = delegate{ return "AA";};
public string GetAA(Func<string> func){//做为参数传递
var aa = func();
Console.WriteLine(aa);
}
有人私信我,我有空再次总结,有什么不对的地方请私聊。