大家好,欢迎来到IT知识分享网。
【目录】
1 委托
2 事件-概念的引出
3 事件-关于异常
4 事件-关于异步
5 委托-Func与Action
1 委托
//定义一个委托public delegate int MyDelegate(int x, int y);//与委托匹配的一个方法public static int Add(int a, int b){return a + b;}//与委托匹配的另一个方法public static int Reduce(int a, int b){return a - b;}//示例:将委托/方法当参数传递public static int Test(MyDelegate MD){return MD(10, 20);}static void Main(string[] args){int a, b, x, y;MyDelegate md;//将委托指向Add这个方法,并进行相关操作md = Add;a = md(1, 2);b = Test(md);//再将委托指向Reduce这个方法,并进行相关操作md = Reduce;x = md(7, 2);y = Test(md);Console.WriteLine($"1+2={a},10+20={b},7-2={x},10-20={y}");Console.ReadLine();}
//定义一个委托public delegate void MyDelegate1(int x);public static void Method1(int a){Console.WriteLine($"a={a}");}public static void Method2(int b){Console.WriteLine($"b={b}");}static void Main(string[] args){MyDelegate1 md = ;md += Method1;md += Method2;md(35);Console.ReadLine();}
b=35
但是委托有一个弊端,它可以使用“=”将所有已经订阅的取消,只保留=后的这一个订阅。
2 事件-概念的引出
也就是说发布者发布一个事件后,订阅者针对他只能进行自身的订阅和取消。
//定义一个委托public delegate void MyDelegate1(int x);//定义一个事件public event MyDelegate1 emd;
//@sender: 引发事件的对象//@e: 传递的参数public delegate void EventHandler(object sender, EventArgs e);//使用public event EventHandler emd;
public class Demo{public event EventHandler emd;public void RaiseEvent(){emd(this, EventArgs.Empty);}}static void Main(string[] args){var instance = new Demo();instance.emd += (sender, arg) =>{Console.WriteLine("执行事件1!");};instance.emd += (sender, arg) =>{Console.WriteLine("执行事件2!");};instance.RaiseEvent();Console.ReadLine();}
事件是按照+=的订阅先后顺序执行的。
3 事件-关于异常
现在,我们在第一个订阅者中加入异常,如下:
instance.emd += (sender, arg) =>{Console.WriteLine("执行事件1!");throw new Exception("执行事件1,错误");};
可见,如果你想让所有订阅者都执行处理的话,那每个订阅者必须在订阅程序内自己处理好异常,不能抛出来!
4 事件-关于异步
instance.emd += async (sender, arg) =>{Console.WriteLine("执行事件1!");await Task.Delay(1000);Console.WriteLine("执行事件1!完毕");};
执行事件1!完毕
5 委托-Func与Action
本文最开始探讨委托,然后直接顺到了事件的相关话题上。其实,关于委托还有一个重点话题漏掉了,那就是Func与Action。
同时,若再用lambda表达式取代被委托指向的具体方法,则整个委托的“定义+赋值”两步将大大简化(lambda表达式本来也是方法定义的一种简化形式)。
下面,把最开始委托章节中关于加减法的程序代码,用Func与lambda表达式进行简化改造,改造后的代码如下:
//示例:将委托/方法当参数传递public static int Test(Func<int, int, int> MD){return MD(10, 20);}static void Main(string[] args){int a, b, x, y;Func<int, int, int> md;//将委托指向加法,并进行相关操作md = (t, v) => t + v;a = md(1, 2);b = Test(md);//再将委托指向减法,并进行相关操作md = (t, v) => t - v;x = md(7, 2);y = Test(md);Console.WriteLine($"1+2={a},10+20={b},7-2={x},10-20={y}");Console.ReadLine();}
是不是代码大大简化了?简化了哪些内容,你可以前后对比一下…(本文完)
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/159483.html