【目录】1 委托2 事件-概念的引出3 事件-关于异常4 事件-关于异步5 委托-Func与Action1 委托 //定义一个委托 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(); } ↓关注下方,收集最精彩.Net集锦↓
b=35 但是委托有一个弊端,它可以使用“=”将所有已经订阅的取消,只保留=后的这一个订阅。 2 事件-概念的引出 //定义一个委托 public delegate void MyDelegate1(int x); //定义一个事件 public event MyDelegate1 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 事件-关于异常现在,我们在第一个订阅者中加入异常,如下:
可见,如果你想让所有订阅者都执行处理的话,那每个订阅者必须在订阅程序内自己处理好异常,不能抛出来! 4 事件-关于异步 instance.emd += async (sender, arg) => { Console.WriteLine('执行事件1!'); await Task.Delay(1000); Console.WriteLine('执行事件1!完毕'); }; 执行事件1!完毕 5 委托-Func与Action本文最开始探讨委托,然后直接顺到了事件的相关话题上。其实,关于委托还有一个重点话题漏掉了,那就是Func与Action。 在委托delegate出现了很久以后,微软的.NET设计者们终于领悟到,其实所有的委托定义都可以归纳并简化成只用Func与Action这两个语法糖来表示。其中,Func代表有返回值的委托,Action代表无返回值的委托。有了它们两,我们以后就不再需要用关键字delegate来定义委托了。 同时,若再用lambda表达式取代被委托指向的具体方法,则整个委托的“定义+赋值”两步将大大简化(lambda表达式本来也是方法定义的一种简化形式)。 下面,把最开始委托章节中关于加减法的程序代码,用Func与lambda表达式进行简化改造,改造后的代码如下:
是不是代码大大简化了?简化了哪些内容,你可以前后对比一下...(本文完) |
|
来自: 黄爸爸好 > 《net core》