定义:public delegate int BinaryOp(int x, int y);表示一个指向操作两个整数返回一个整数的方法。当编译的时候,委托就会变成有三个公共方法的东东,三个方法:Invoke、BeginInvoke、EndInvoke方法,第一个用来同步调用的,后两个异步调用。而异步调用一般用来调用比较耗时的方法。(我们写界面的时候,经常会用到,防止界面卡逼,就异步调用,不影响界面的移动和其他的操作。)在内存中她们的表示经常如下(其中下划线为红线的可以写成返回类型和参数类型(不论个数)):由上面的那个伪代码就能看得出来,委托其实是和类在一个层次的东西,它还有基类,两个基类:System.MulticastDelegate和System.Delegate基类。简单的委托实例(两个数的加法):怎么干?委托在底层,实际上在MulticastDelegate派生类上调用了编译器生成的invoke方法。说下委托的类型安全:如果试图将一个不匹配的方法传入委托,就会收到编译错误(例如上面的委托你传入一个参数的方法。)
拿上面的那个Car举例子来说,如果我们派生了一个NewCar的类,并创建一个委托类型,可以指向返回该类的方法。因为委托是安全类型,我们不能用返回Car累的委托,必须再定义一个新委托。而委托协变,就是允许我们创建一个委托能指向返回类以及相关继承体系的方法。我们可以将上面一个返回Car的委托结果,进行强制转换获得。CarDelegate car = new carDelegate(new NewCar(xxx));用的时候,NewCar newCar = (NewCar)car;。
微软推荐的事件模式是什么样子的呢?查看基础类库中某个类型发送的事件时,会发现底层委托的第一个参数是一个System.Object,第二个参数是一个派生自System.EventArgs的子类型。System.EventArgs基类,表示一个不发送任何自定义信息的事件:所以,如果我们如果要传递自定义数据,那么就需要创建一个派生自EventArgs的类。如下:我们修改委托,增添一个CarEventArgs参数,就可以传递数据了。(事件不变。)public delegate void CarEngineHandler(object sender, CarEventArgs args);//定义委托调用方法: if (Exploded != null) { Exploded(this,new CarEventArgs("Sorry, this car is dead...")); }如何接受者想与发送事件的对象交互,我们可以现实强制转换System.Object。这样就可以使用传递给事件通过对象中的任何公共成员。
Lambda表达式是干毛用的?好吧,彻底被干败了,觉得匿名方法还麻烦,都把裤子脱了还嫌麻烦,于是就让你比脱了裤子还简单,看我Lambda的吧:编写:Lambda表达式是这样编写的,首先,定义一个参数列表,“=>”标记紧随其后,然后就是处理这些参数的语句。下面表达式可以说明:ArgumentsToProcess=>StatementsToProcessThem。那么用Lambda表达式,如何表达上面的注册处理程序?如下:c1.AboutToBlow +=(sender,e)=>{Console.WriteLine("Eek! Going to fast!");//在里面可以处理传入的参数};