理解C#中的事件
前面文章中介绍了委托相关的概念,委托实例保存这一个或一组操作,程序中将在某个特定的时刻通过委托实例使用这些操作。
如果做过GUI程序开发,可能对上面的描述会比较熟悉。在GUI程序中,单击一个button会触发一个click事件,然后会执行一系列的操作,这一系列的操作就被存放在一个委托实例中。
接下来我们就看看事件。
使用委托中的问题
回到前面文章中苹果和富士康的例子,苹果将iphone的组装、包装和运输的工作全部委托给了富士康。
根据上面的描述,我们修改了一下代码,在Apple这个类中加入一个订单属性,苹果只要接到新的订单,就发送一个通知给富士康,然后富士康就会执行一系列的操作了(组装、包装和运输)。
在主程序中,苹果将iphone的组装、包装和运输工作委托给了富士康,然后苹果每次收到订单,就会通过委托实例"VerdorToAssembleIphone"让富士康去执行一系列操作。
classApple { //声明委托类型 publicdelegatevoidAssembleIphoneHandler(intnum); publicAssembleIphoneHandlerVerdorToAssembleIphone;
publicvoidDesignIphone() { Console.WriteLine("DesignIphoneByApple"); }
privateintorderNum; publicintOrderNum { get{returnthis.orderNum;} set { this.orderNum=value; if(VerdorToAssembleIphone!=null) { VerdorToAssembleIphone(this.orderNum); } } } }
classFoxconn { //与委托类型签名相同的方法 publicvoidAssembleIphone(intnum) { Console.WriteLine("Assemble{0}IphoneByFoxconn",num); }
publicvoidPackIphone(intnum) { Console.WriteLine("Pack{0}IpnoneByFoxconn",num); }
publicvoidShipIphone(intnum) { Console.WriteLine("Ship{0}IphoneByFoxconn",num); } }
classProgram { staticvoidMain(string[]args) { Appleapple=newApple(); Foxconnfoxconn=newFoxconn(); apple.VerdorToAssembleIphone=newApple.AssembleIphoneHandler(foxconn.AssembleIphone); apple.VerdorToAssembleIphone+=newApple.AssembleIphoneHandler(foxconn.PackIphone); apple.VerdorToAssembleIphone+=newApple.AssembleIphoneHandler(foxconn.ShipIphone);
apple.OrderNum=100; Console.Read(); } }