? 委托可以说是要领的调集,里面放着要领列表,当挪用的时候就会挪用全部的要领列表
? 小我私家理解 :
当声明和创建时委托时, 它是个 东西
当使用委托,挪用要领时,它是个 要领
声明委托类型 delegate void MyDel(int x)比拟一下filed字段声明
int count = 5;? 可以知道delegate 对应 int, 它是 种类型,void MyDel( int x ) 对应count
创建东西 private delegate void MyDel(int x); MyDel requestHandler =new MyDel(addCount); private void addCount(int x){ x+=x; } 为委托类型里面添加要领 requestHandler += addCount1; requestHandler += addCount2; //挪用 requestHandler(5); private void addCount1(int x){ } private void addCount2(int x){ }? 委托类型要是有返回值,那么最后一个要领执行的返回值就是就功效
委托要领内存放的是匿名要领? 委托里的匿名要领的感化是初始化委托,就是要领列表中的要领是没有名字的
MyDel requestHandler; requestHandler = delegate(int x){ x+=x; } 匿名要领捕获变量? 从这里也可以知道匿名要领的声音应该是与int y =5 ;同级或是比它低条理
MyDel requestHandler; int y=5; requestHandler = delegate(int x){ x=y+5; } 委托 + lamb表达式 MyDel requestHandler; MyDel requestHandler1; //匿名要领 requestHandler = delegate(int x) {x+20;} requestHandler1 = x => {x+20;} 事件? 联想一下不雅察看者模式,当某一状态触发的时候,就会触发一些东西的要领,这个过程就像是委托一样挪用要领列表一样,颁布者就是一个委托东西,订阅者就是在里面的要领列表. 和要领,属性一样,事件event 是类或布局的成员,所以我们不能在一段可执行代码中声明事件,事件的初始值为null
? 小我私家理解:
event 的声明为事件的关键字,和要领,属性,字段平级
当在挪用时事件就是挪用要领
?对付事件的私有委托, 需要注意的事项:
直接上代码
delegate void CountDel(); class Incrementer { //事件自己就是个不雅察看者,一旦被触发,就顿时通知订阅者 public event CountDel MyEvent; //这是某个触发点 public void DoCount (){ for(int i =1;i<100;i++){ if(i%12==0 && MyEvent!=null){ MyEvent(); } } } } //订阅者 class Dozens{ public int DozenCount {get;private set} public void Dozens(Incrementer incrementer){ incrementer +=AddDozenCount; } public void AddDozenCount(){ DozenCount++; } } class Test { Incrementer inc = new Incrementer(); Dozens dozens = new Dozens(inc); inc.DoCount(); } 标准事件(EventHandler)? .NET 环境中界说的标准事件,界说如下:
public event delegate EventHandler (object sender , EventArgs args)? 从形参名字可以看出第一个参数暗示发送者,第二个参数通报一些信息
通过扩展EventArgs 来通报数据? 需要配置泛型委托来实现,上代码
//自界说EventArgs class MyEventArgs : EventArgs{ public int Anum{ get;set; } } class Incrementer { //事件自己就是个不雅察看者,一旦被触发,就顿时通知订阅者 public event EventHandler<MyEventArgs> MyEvent; //这是某个触发点 public void DoCount (){ MyEventArgs eventArgs = new MyEventArgs(); for(int i =1;i<100;i++){ if(i%12==0 && MyEvent!=null){ eventArgs.Anum = i; MyEvent(this,eventArgs); } } } } //订阅者 class Dozens{ public int DozenCount {get;private set} public void Dozens(Incrementer incrementer){ incrementer +=AddDozenCount; } public void AddDozenCount(object obj,MyEventArgs e){ Console.writeLine("当数到{0}时,增加一",e.Anum); DozenCount++; } } class Test { static void main (){ Incrementer inc = new Incrementer(); Dozens dozens = new Dozens(inc); inc.DoCount(); Console.writeLine("共记录了{0}次",dozens.DozenCount); } } 异步? 异步是什么 ? 例如你去买奶茶,伙计说请稍等,你在伙计做奶茶的同时,你可以刷刷伴侣圈,做其他事,等奶茶做好了,你再付钱,完成了买奶茶这件事。对付我来说,伙计调配奶茶就是一个异步要领。异步不必然就是在其他线程执行,也可能在同个线程执行
? 首先看一下异步要领
class Today{ async Task<Tea> MakeTeaAsync (){ Console.Writeline("开始做奶茶呀!"); Salewoman girl = new Salewomen(); Tea tea = await girl.makeTea(); return tea; } } class Test { public static void main(string args){ Today to = new Today(); Task<Tea> teaTask = to.MakeTeaAsync(); Console.writeLine(teaTask.Tostring()); } }? 异步要领有三种返回值void,Task<T>,Task ,获取异步要领的功效挪用Task.Result.挪用要领的接收都是用Task 东西接收.
? 如果我们的异步不需要异步的数据,那么可以一直执行下去,但是当并行的线程需要异步的数据仍然会梗阻期待
class Test{ public static void main (){ Task<int> task = CountAsync(); ... //下面需要用到异步的数据,那么插手异步没完成,此处会梗阻 Console.wrintLine("功效为: "+task.Result); //异步要领此外两种返回值 Task task = CounterAsync1(); Task task = CounterAsync2();//或直接挪用异步要领 CounterAsync(); } } private async Task<int> CountAsync(){ int result = await SocketHelper.get(); return result; } private async Task CountAsync1(){ int result = await SocketHelper.getAgain(); Console.writeLine("hello world !"); } private async void CountAsync2(){ int result = await SocketHelper.getAgain1(); }? 那么有没有,解决要领呢?我就是不想梗阻. 有, 回调.稍后介绍
异步要领在新线程执行