《NO委托与事》PPT课件.ppt_第1页
《NO委托与事》PPT课件.ppt_第2页
《NO委托与事》PPT课件.ppt_第3页
《NO委托与事》PPT课件.ppt_第4页
《NO委托与事》PPT课件.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

委托与事件,In programming: situations need to execute a particular action, but dont know in advance which method, or even which object to call upon to execute. 例如: 按下按钮确定,要激发一些对象去反应,但可能存在一对多的关系,哪一个反应还不一定. 绑定到一个对象上不合适,那就可以把按钮连接到一个委托上然后当程序执行时再启用特定需要的方法。,Console programs & GUI programs执行的区别,控制台程序: 开始执行直到程序步骤结束 GUI程序:事件驱动,用户接口,视用户操作行为作出不同响应,不同行为引发不同的方法调用。,委托和事件,1、委托,委托是一种特殊的类型(class),用途是来实现对一种方法的“封装”。在某种事件发生时,自动调用该方法。好处显然易见,它使用户可以自定义自己的方法实现,通过封装,CLR会在相应事件激发时调用你定义的方法,实现自定义的功能。 C#中的委托类似于C或C+中的函数指针,但两者有本质区别:C或C+不是类型安全的,但C#中的委托是面向对象的,而且是类型安全的。从某种角度来讲,委托是一个引用类型,用来封装带有特定签名和返回类型的方法。,声明委托的具体格式如下: 访问修饰符 delegate 结果类型 委托标识符(形参列表); 委托类型可以在声明类的任何地方声明。 实例化委托 委托使用new运算符来实例化且新创建的委托实例所引用的对象为以下情形之一: 委托创建表达式中引用的静态方法 委托创建表达式中引用的目标对象(此对象不能为null)和实例方法 另一个委托,Delegate void MyDelegate(int x); Class MyClass Public static void Method1(int i)/自定义静态方法内容 Public void Method2(int i)/实例方法 Class Testclass Static void Maint() MyDelegate delegate1= new MyDelegate(MyClass.Method1);/静态方法实例化委托 MyClass class1 =new MyClass(); MyDelegate delegate2= new MyDelegate(class1.Method2);/实例方法实例化委托 MyDelegate delegate3=new MyDelegate(delegate2);/使用另一个委托实例化委托 ,(3) 使用委托 实例化一个委托后,可以通过委托对象的名称及放入括号的要传递给委托的参数来调用委托对象。调用委托时,调用表达式的主表达式必须是委托类型的值。,namespace HR /定义员工结构体 public struct Emp public string Name; /员工姓名 public char Gender; /员工性别 public decimal Salary; / 员工薪水 public Emp(string name, char gender, decimal salary) /构造员工对象 this.Name = name; this.Gender = gender; this.Salary = salary; ,/定义一个员工信息处理委托 public delegate void ProcessEmpDelegate(Emp emp); /对员工信息进行管理 public class HRMan / 构造员工列表 ArrayList emplist = new ArrayList(); /将员工添加到列表中 public void AddEmp(string name, char gender,decimal salary) emplist.Add(new Emp(name,gender,salary); /针对female员工,调用委托处理 public void ProcessFemaleEmp(ProcessEmpDelegate processEmp) foreach (Emp e in emplist) if (e.Gender = F) /调用委托处理 processEmp(e); ,namespace HRManClient using HR; / 对员工信息进行处理 class SalaryTotaller int countEmp = 0; decimal SalaryEmp = 0.0m; /计算员工总工资及总人数 internal void AddEmpToTotal(Emp emp) countEmp += 1; SalaryEmp += emp.Salary; /计算平均工资 internal decimal AverageSalary() return SalaryEmp / countEmp; ,class Test /输出员工姓名 static void PrintName(Emp e) Console.WriteLine(“ 0“, e.Name); /初始化员工列表 static void InitEmps(HRMan hr) hr.AddEmp(“zhangsan“,F,1200); hr.AddEmp(“lisi“,M,2631); hr.AddEmp(“wangwu“,F,3254); hr.AddEmp(“qianliu“,M,800); ,/ Main函数 static void Main() HRMan hrman = new HR.HRMan(); / 初始化员工列表 InitEmps(hrman); / 输出female员工姓名 Console.WriteLine(“femal employeer name:“); / 创建委托对象并与静态方法进行关联 hrman.ProcessFemaleEmp(new ProcessEmpDelegate(PrintName); / 通过实例化SalaryTotaller对象得到平均薪水 SalaryTotaller totaller = new SalaryTotaller(); / 创建一个委托对象,并且与非静态方法关联 hrman.ProcessFemaleEmp(new Proce

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论