欢迎来到天天文库
浏览记录
ID:36698139
大小:3.03 MB
页数:37页
时间:2019-05-10
《《NO委托与事》PPT课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、委托与事件Inprogramming:situationsneedtoexecuteaparticularaction,butdon'tknowinadvancewhichmethod,orevenwhichobjecttocallupontoexecute.例如:按下按钮确定,要激发一些对象去反应,但可能存在一对多的关系,哪一个反应还不一定.绑定到一个对象上不合适,那就可以把按钮连接到一个委托上然后当程序执行时再启用特定需要的方法。Consoleprograms&GUIprograms执行的区别控制台程序:开始执行直到程序步骤结束GUI程序:事件驱动,用户接口,视用户操作行为作出不同响应,
2、不同行为引发不同的方法调用。委托和事件1、委托委托是一种特殊的类型(class),用途是来实现对一种方法的“封装”。在某种事件发生时,自动调用该方法。好处显然易见,它使用户可以自定义自己的方法实现,通过封装,CLR会在相应事件激发时调用你定义的方法,实现自定义的功能。C#中的委托类似于C或C++中的函数指针,但两者有本质区别:C或C++不是类型安全的,但C#中的委托是面向对象的,而且是类型安全的。从某种角度来讲,委托是一个引用类型,用来封装带有特定签名和返回类型的方法。声明委托的具体格式如下:[访问修饰符]delegate结果类型委托标识符([形参列表]);委托类型可以在声明类的任何地方声明
3、。实例化委托委托使用new运算符来实例化且新创建的委托实例所引用的对象为以下情形之一:委托创建表达式中引用的静态方法委托创建表达式中引用的目标对象(此对象不能为null)和实例方法另一个委托DelegatevoidMyDelegate(intx);ClassMyClass{PublicstaticvoidMethod1(inti){//自定义静态方法内容}PublicvoidMethod2(inti){//实例方法}}ClassTestclass{StaticvoidMaint(){MyDelegatedelegate1=newMyDelegate(MyClass.Method1);//静态
4、方法实例化委托MyClassclass1=newMyClass();MyDelegatedelegate2=newMyDelegate(class1.Method2);//实例方法实例化委托MyDelegatedelegate3=newMyDelegate(delegate2);//使用另一个委托实例化委托}}(3)使用委托实例化一个委托后,可以通过委托对象的名称及放入括号的要传递给委托的参数来调用委托对象。调用委托时,调用表达式的主表达式必须是委托类型的值。namespaceHR{//定义员工结构体publicstructEmp{publicstringName;//员工姓名publicc
5、harGender;//员工性别publicdecimalSalary;//员工薪水publicEmp(stringname,chargender,decimalsalary)//构造员工对象{this.Name=name;this.Gender=gender;this.Salary=salary;}}//定义一个员工信息处理委托publicdelegatevoidProcessEmpDelegate(Empemp);//对员工信息进行管理publicclassHRMan{//构造员工列表ArrayListemplist=newArrayList();//将员工添加到列表中publicvoi
6、dAddEmp(stringname,chargender,decimalsalary){emplist.Add(newEmp(name,gender,salary));}//针对female员工,调用委托处理publicvoidProcessFemaleEmp(ProcessEmpDelegateprocessEmp){foreach(Empeinemplist){if(e.Gender=='F')//调用委托处理processEmp(e);}}}}namespaceHRManClient{usingHR;//对员工信息进行处理classSalaryTotaller{intcountEmp
7、=0;decimalSalaryEmp=0.0m;//计算员工总工资及总人数internalvoidAddEmpToTotal(Empemp){countEmp+=1;SalaryEmp+=emp.Salary;}//计算平均工资internaldecimalAverageSalary(){returnSalaryEmp/countEmp;}}classTest{//输出员工姓名staticvoidPrint
此文档下载收益归作者所有