版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第12章,代理和事件,2,介绍代理,在C#中代理允许你动态的改变类中方法的引用。 Delegate(代理)是引用类型的变量,它包含到一个方法的引用。 代理是在运行时间接调用方法的一种通用目的机制,它们在C#程序中的基本用途是实现事件和回调的方法。 为了在你的程序中实现代理,你需要声明代理、实例化代理和使用代理。,3,委托,Multiply(int,int) . Divide(int,int) . ,在运行时确定调用哪种方法,委托和方法必须具有相同的签名,- public delegate Call(int num1, int num2); -,4,应用代理三步骤,5,声明代理,访问修饰符 de
2、legate 返回类型 委托名();,语法,6,实例化代理,指定需要的方法的地址给代理对象。 这可以通过调用delegate类的构造函数并且传递方法名来完成。,7,实例化代理(续),下面的例子显示了如何指定方法的地址给一个代理变量: public void DelegateFunction(string PassValue) / Method implementation Here public delegate void MyDelegate(string ArgValue); public void UseMethod() MyDelegate DelegateObject = new M
3、yDelegate(DelegateFunction);,8,定义委托,class Delegates public delegate int Call(int num1, int num2); class Math public int Multiply(int num1, int num2) / 实现 public int Divide(int num1, int num2) / 实现 class TestDelegates static void Main() Call objCall; Math objMath = new Math(); objCall = new Call(math
4、.Multiply); ,将方法与委托关联起来,9,定义委托,class Delegates / 委托定义 public delegate int Call(int num1, int num2); class Math / 乘法方法 public int Multiply(int num1, int num2) return num1*num2; / 除法方法 public int Divide(int num1, int num2) return num1/num2; ,static void Main(string args) / 委托的对象 Call objCall; / Math 类
5、的对象 Math objMath = new Math(); / 将方法与委托关联起来 objCall = new Call(objMath.Multiply); / 将委托实例化 result = objCall(5, 3); System.Console.WriteLine(结果为 0, result); ,将方法与委托关联起来,10,使用代理,class PrintToDevice static FileStream FStream; static StreamWriter SWriter; public delegate void PrintData(String s); public
6、 static void WriteConsole(string str) Console.WriteLine(0 Console,str); public static void WriteFile(string s) FStream = new FileStream(c:StoreData.txt,FileMode.Append,FileAccess.Write); SWriter = new StreamWriter(FStream); s = s + File; SWriter.WriteLine(s); SWriter.Flush(); SWriter.Close(); FStrea
7、m.Close(); ,public static void DisplayData(PrintData PMethod) PMethod(This should go to the); public static void Main() PrintData Cn = new PrintData(WriteConsole); PrintData Fl = new PrintData(WriteFile); DisplayData(Cn); DisplayData(Fl); Console.Read(); ,11,代理的类型,单播代理 多播代理,12,class PrintToDevice st
8、atic FileStream FStream; static StreamWriter SWriter; public delegate void PrintData(String s); public static void WriteConsole(string str) Console.WriteLine(0 Console,str); public static void WriteFile(string s) FStream = new FileStream(c:StoreData.txt,FileMode.Append,FileAccess.Write); SWriter = n
9、ew StreamWriter(FStream); s = s + File; SWriter.WriteLine(s); SWriter.Flush(); SWriter.Close(); FStream.Close(); ,public static void DisplayData(PrintData PMethod) PMethod(This should go to the); public static void Main() PrintData MlDelegate = new PrintData(WriteConsole); MlDelegate+=new PrintData(
10、WriteFile); DisplayData(MlDelegate); MlDelegate-=new PrintData(WriteFile); DisplayData(MlDelegate); Console.Read(); ,绑定到委托,取消绑定,13,事件,“请听题”,集中注意力聆听,其他人,事件源,事件的发布者,事件的订阅人,不关心,未订阅该事件,定义事件 为对象订阅该事件 将发生的事件通知给订阅人,14,定义事件,访问修饰符 event 委托名 事件名;,语法,public delegate void delegateMe(); private event delegateMe
11、eventMe;,15,订阅事件,eventMe += new delegateMe(objA.Method); eventMe += new delegateMe(objB.Method);,16,通知订阅对象,if(condition) eventMe(); ,调用订阅特定事件的对象的所有委托,17,定义一个事件: 在发布者类中事件的定义包括代理的声明和基于代理的事件的声明。 下面的代码定义了一个名为TimeToRise的代理和一个名为RingAlarm的事件,当它被引发时,调用TimeToRise代理: public delegate void TimeToRise(); private
12、 event TimeToRise RingAlarm;,使用带事件的代理(续),18,订阅事件: 发布者类事件需要与它的处理程序关联。 事件处理程序是使用代理关联的。 当发布者对象产生事件的时候,订阅对象关联方法,它需要被调用。 需求应该使用事件实现。下面的代码显示了Student类如何订阅名为TimeToRise的事件: Student PD= new Student(); RingAlarm = new TimeToRise(PD.WakeUp);,使用带事件的代理(续),19,通知订阅者事件: 订阅者对象将订阅者对象通知发布者对象。事件被产生以通知处理程序。 在你想通知事件给事件的订阅
13、者的地方写出这个代码块: if (RingAlarm != null) RingAlarm( ); ,使用带事件的代理(续),20,演示:示例 4,示例,class TestEvents STAThread static void Main(string args) / 委托的对象 Delegate objDelegate = new Delegate(); / ClassA 的对象 ClassA objClassA = new ClassA(); / ClassB 的对象 ClassB objClassB = new ClassB(); / 订阅该事件 objDelegate.NotifyE
14、veryOne += new Delegate.MeDelegate(objClassA.DispMethod); objDelegate.NotifyEveryOne += new Delegate.MeDelegate(objClassB.DispMethod); objDelegate.Notify(); ,class Delegate / 定义委托 public delegate void MeDelegate(); / 定义事件 public event MeDelegate NotifyEveryOne; public void Notify() / 如果事件不为 null if(
15、NotifyEveryOne != null) Console.WriteLine(触发事件:); / 触发事件 NotifyEveryOne(); ,class ClassA public void DispMethod() Console.WriteLine(“Class A 已接到 NotifyEveryOne 事件的通知!); / 第二个类 class ClassB public void DispMethod() Console.WriteLine(“Class B 已接到 NotifyEveryOne 事件的通知! ); ,21,问题描述: 在一个空调制造公司,工作时间是从上午9点
16、到下午6点。公司的管理是灵活的,它允许工人晚到一个小时。当他们到达公司的前台的时候,工人的到达时间是电子记录在日志文件中的。用于记录每个工人出勤的程序需要记录适当的信息。 帮助公司设计一个记录出勤的日志程序。,演示:出勤日志,22,解决方案: 为了设计程序,你需要完成下面的任务: 确定你将在程序中使用的技术。这个技术将使你能够动态的调用相应的方法来记录出勤情况。 创建基于控制台的程序来实现工人出勤日志。 编译和执行程序。,演示:出勤日志(续),23,总结,委托包含对方法而不是方法名称的引用 C# 中的事件允许一个对象将发生的事件或修改通知其他对象,24,ISAS,时间:第9周 每两人一组,选取
17、一个题目,将自己思路整理做成PPT 两人轮流演讲,25,题目,封装(访问修饰符) 方法 静态变量和静态方法 数组 构造函数和析构函数 函数重载和操作符重载 抽象类和接口 文件 异常处理 多线程 代理和事件,26,评分标准,幻灯 40% 1、要求精致、规范、专业。页面美观、文字简洁明了。可用多种表现形式,页数适当,一般每人不应少于5页但也不能多于10页幻灯片,占15%。 2、主题明确,体现内容恰当,使用提纲性语言,占25%。 演讲 40% 1、技巧:表情自然、吐词清楚、声音洪亮、抑扬顿挫、发音标准、语速适度、能脱稿、流畅、富有感染力的演讲。注意与观众的互动交流,适当使用肢体语言。(占10%)。 2、时间控制:每组演讲时间
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物业消防安全自查报告
- 心理变态精神测试题目及答案
- 行政执法人员综合法律知识测试题及答案
- 应急供货方案及措施
- 油库消防安全知识题及答案
- 执法人员考试试题及答案
- 职业技能鉴定国家题库管道工考试试题及答案
- 中国武术段位制理论考试试卷及答案
- 种子学加工与贮藏题库及答案
- 2025年广东省云浮市七年级政治上册期中考试试卷及答案
- 2026年社保经办人员业务考试题库及答案
- 《创新创业基础》 课件 第5章 创业机会
- 中核集团非招标管理办法
- 新生儿感染性肺炎护理查房
- 黎族舞蹈教学课件
- 体检科管理制度
- 通站(2017)8012 铁路站场排水构筑物
- 统编版(2024新版)三年级上册道德与法治教学计划
- 字体设计(上海出版印刷高等专科学校)智慧树知到答案2024年上海出版印刷高等专科学校
- 9步达到财务自由
- 高级中学学生军事训练教程(中职版)PPT完整全套教学课件
评论
0/150
提交评论