委托
声明委托:声明一个委托对象(专门接委托的人),这个委托对象会告诉别人当你给叫我的时候我就会
param1.给你什么类型结果;param2:我叫什么名字;param3:我需要你提供什么
delegate <return type> <delegate-name> <parameter list>
示例:
我叫 MyDelegate,当你调用我的时候我需要给我一个string类型的参数,我会返回一个int类型的值给你
delegate int MyDelegate (string s);
给委托赋值
委托自己是不会进行动作的,只会调用其他人(方法)的动作,可以理解为,
你想买肯德基(方法名)的饮料(参数),你想买古茗的饮料
那你可以把这个事告诉我,我来帮你跑腿
//告诉我我都需要去哪些地方
MyDelegate=buyKFC;
MyDelegate+=buyGUMING;
//告诉我你想要什么并让我开始行动
int r=MyDelegate("饮料")
C#自带两种已经封装好的委托
//没有返回值的委托
Action<T> <delegate-name>=new Action<T>(function-name)
//示例
Action<string> MyDelegate = new Action<string>(buDrink);
//带返回值的委托
Func<T> <delegate-name>=new Action<T>(function-name)
//示例
//有返回值,无参数
Func<string> MyDelegate = new Func<string>(buDrink);//<>中传入的为buDrink的返回值类型
//有返回值,有参数
Func<string,string> MyDelegate = new Func<string,string>(buDrink);//<>中传入的最后一个参数为buDrink的返回值,其他均为FuncBook的参数
事件:
事件的声明:
声明事件时需要声明什么类型的代理人可以代理处理这个事件,即将事件发生后的动作权交给委托
//声明一个委托
delegate void HandlerName();
//声明一个xx委托类型的事件
public event HandlerName eventName;
举个例子来理解委托:
事件:我想喝饮料了
服务提供商:肯德基、古茗
委托:外卖小哥
背景:
1.肯德基和古茗为了盈利,订阅了很多人的动态
2.我和一个外卖小哥签了一个契约,当我召唤他的时候,他就要去契约里列好的商家的窗口
接下来是事情发生顺序
- 肯德基开店了,在窗口前留了个服务,当有人到窗口前就给自己做一份可乐并在github论坛留下一个信息:“嘿嘿,老板说的,有人来我才可以动,但是不让我搭理任何人,只能做可乐,谢谢你了陌生人”
void KFCWin(){
makeDrink
printInGithub(“嘿嘿,老板说的,有人来我才可以动,但是不让我搭理任何人,只能做可乐,谢谢你了陌生人”)
}
- 古茗开店了,在窗口前留了个服务,当有人在窗口前说要买饮料时就在github论坛留下信息“听说最近有精神病跑出来了,这个人到这儿也不说话,我也不敢说话,害怕”
void gumingWin(){
printInGithub(“听说最近有精神病跑出来了,这个人到这儿也不说话,我也不敢说话,害怕”)
}
3.我创造了一个外卖小哥,并和他签订了契约
main(){
delegate void waimaiHandle();
public event waimaiHandle callWaimai;
callWaimai+=KFCWin
callWaimai+=gumingWin
}
- 我想喝饮料了,于是召唤了外卖小哥,叫来了才发现契约里没写我想喝什么,但是不想停下手上的code,于是心想就这样吧
main(){
delegate void waimaiHandle();
public event waimaiHandle callWaimai;
callWaimai+=KFCWin
callWaimai+=gumingWin
callWaimai()
}
- 正在code的时候,我遇到了一个难题,很久都没有解决,就打开了github,突然发现有两个新帖子
KFC:“嘿嘿,老板说的,有人来我才可以动,但是不让我搭理任何人,只能做可乐,谢谢你了陌生人”
guming:“听说最近有精神病跑出来了,这个人到这儿也不说话,我也不敢说话,害怕”
!!!怪不得他不回来也没发消息,我没有找他要返回值…