c#委托与反射

上传人:第*** 文档编号:49761768 上传时间:2018-08-02 格式:PPT 页数:36 大小:990.50KB
返回 下载 相关 举报
c#委托与反射_第1页
第1页 / 共36页
c#委托与反射_第2页
第2页 / 共36页
c#委托与反射_第3页
第3页 / 共36页
c#委托与反射_第4页
第4页 / 共36页
c#委托与反射_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《c#委托与反射》由会员分享,可在线阅读,更多相关《c#委托与反射(36页珍藏版)》请在金锄头文库上搜索。

1、 Hands-On实训教程系列第十四章第十四章委托、事件和反射Hands-On实训教程系列回顾l读写文本文件的读写器分别是什么?lXML文件的节点可以自由扩展吗?Hands-On实训教程系列l实现委托l定义和触发事件l理解程序集的概念l理解反射的概念本章目标Hands-On实训教程系列委托l函数指针l类型安全l用于将方法传递给其他函数4 4Hands-On实训教程系列委托的概念l委托是一种引用方法的类型。l 一旦为委托绑定(分配)了方法,委托将与该方 法具有完全相同的行为。 l 可以为委托绑定(分配)一个方法或多个方法, 绑定一个方法的委托成为单路广播委托,绑定多个方 法的委托称为多路广播委托

2、。5 5Hands-On实训教程系列委托的声明l访问修饰符 delegate (参 数列表);l例如:public delegate void BankEmployee( ); l注意:委托可以理解为一种类型,可以在定义类的任 何地方定义委托Hands-On实训教程系列委托的使用l使用委托包括以下步骤:声明委托实例化委托使用委托using System; using System.Collections.Generic; using System.Text; namespace MyExample3 public class Apublic int CalA(int a, int b)retu

3、rn (a + b);public class Bpublic int CalB(int a, int b)return (a * b);class Test/声明委托public delegate int Del(int x, int y);static void Main(string args)del h;A objA = new A();B objB = new B();/实例化委托,将委托与方法关联起来h = new Del(objA.CalA);/使用委托实现加法运算int t = h(5, 3);Console.WriteLine(t);/调用方法实现乘法运算int m=objB

4、.CalB(5, 3);Console.WriteLine(m); Hands-On实训教程系列函数签名与委托签名l函数签名由函数的返回值和参数组成。l函数签名与参数名无关。8 8只能为委托分配的签名匹配的方法都可以分配给只能为委托分配的签名匹配的方法都可以分配给 该委托。该委托。换句话说,与委托的签名(由返回类型和参数组换句话说,与委托的签名(由返回类型和参数组 成)匹配的任何方法都可以分配给该委托。成)匹配的任何方法都可以分配给该委托。Hands-On实训教程系列多播委托l包含多个方法的委托称为多播委托,调用多播委托时 会依次调用这多个方法。l多播委托返回值必须为voidl可以使用+=(+

5、) 和 -=(-) 来添加/删除方法delegate void MultipleDel( string param ); static void Main() MultipleDel operations = new MultipleDel( SomeFunc );operations += new MultipleDel( ANotherFunc );operations( someParam ); Hands-On实训教程系列什么是委托?Morning,Jack你好,王小姐l接待外国客户l接待中国客户Hands-On实训教程系列什么是委托?l公司业务发展了,全世界各地都有客户。怎么办?br

6、eak;case Language.Chinese:ChineseGreeting(name);break; Hands-On实训教程系列什么是委托?public void GreetPeople(string name, Language lang)参数类型参数变量假如GreetPeople()方法可以接受一个参数变量,这个变量可以代表另一 个方法,当我们给这个变量赋值 EnglishGreeting的时候,它代表着 EnglsihGreeting() 这个方法;当我们给它赋值ChineseGreeting 的时 候,它又代表着ChineseGreeting()方法。 Hands-On实训教

7、程系列什么是委托?l参数变量命名为 MakeGreeting MakeGreeting(name);public void GreetPeople(string name, * MakeGreeting) MakeGreeting(name); 什么类型?Hands-On实训教程系列委托lMakeGreeting参数所能代表的 ChineseGreeting() 和EnglishGreeting()方法的签名: 应该能够确定 MakeGreeting可以代表的方法种类, 即MakeGreeting可以代表的方法 的 参数类型和返回类型。 public void EnglishGreeting(

8、string name) public void ChineseGreeting(string name)MakeGreeting的 参数类型定义Hands-On实训教程系列委托参数l委托定义了MakeGreeting参数所能代表的方法的种 类,也就是MakeGreeting参数的类型。 public delegate void GreetingDelegate(string name); public void GreetPeople(string name, GreetingDelegate MakeGreeting) MakeGreeting(name); 演示示例2 Delegate

9、Hands-On实训教程系列小结l委托是一个类,它定义了方法的类型,使得可以将方 法当作另一个方法的参数来进行传递,这种将方法动 态地赋给参数的做法,可以避免在程序中大量使用If- Else(Switch)语句,同时使得程序具有更好的可扩展 性。 Hands-On实训教程系列总结l进入的委托实例时,它调用列表中的方法,委托调用 所使用的参数和返回的值均与该方法的对应项相同。 调用委托与调用方法相似。唯一的区别在于不是调用 委托的实现,而是调用与委托相关联的方法的实现代 码。Hands-On实训教程系列事件抢答者宣布人抢答者“请听题”集中注意力聆听 其他人事件源事件的发布者事件的订阅人未订阅该事

10、件 定义事件 为对象订阅该事件 将发生的事件通知给订阅人Hands-On实训教程系列定义事件访问修饰符 event 委托名 事件名; 语法定义事件时,发布者首先定义委托,然后根据委托定义事件。/声明一个委托public delegate void Del();/声明一个事件public event Del Click;Hands-On实训教程系列订阅事件 l订阅事件只是添加一个委托,事件引发时该委托将调 用一个方法。l事件可用作 += 和 -= 运算符左边的操作数。这些运 算符分别用于将事件处理程序添加到所涉及的事件或 从该事件中移除事件处理程序。me.Click += new MyEvent

11、.Del(me.ClickMethod);Hands-On实训教程系列if (Click != null)Console.WriteLine(“引发事件:“);Click();通知订阅对象 调用订阅特定事件的对象的所有委托Hands-On实训教程系列示例/创建一个事件类 class MyEvent/声明一个委托public delegate void Del();/声明一个事件public event Del Click;/创建一个触发事件的方法public void OnClick()if (Click != null)Console.WriteLine(“引发事件:“);Click();/

12、和事件关联的方法public void ClickMethod()Console.WriteLine(“您触发了Click事件!“); class Teststatic void Main(string args)MyEvent me = new MyEvent();/给对象预定事件me.Click += new MyEvent.Del(me.ClickMethod);me.OnClick(); Hands-On实训教程系列小结我们有个高档的热水器,我们给它通上电,当水温超过95度的时候 :1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。 现在写个

13、程序来模拟这个烧水的过程:首先定义一个类来代表热水器,Heater,它有代表水温的字段,叫做 temperature;当然,还有必不可少的给水加热方法BoilWater(),一个发出 语音警报的方法MakeAlert(),一个显示水温的方法,ShowMsg()。演示示例4 Heater Hands-On实训教程系列事件现在假设热水器由三部分组成:热水器、警报器、显示器,它们来自于不同 厂商并进行了组装。那么,应该是热水器仅仅负责烧水,它不能发出警报也 不能显示水温;在水烧开时由警报器发出警报、显示器显示提示和水温。 警报器和显示器告诉热水器,它对它的温度比较感兴趣(注册)。 热水器知道后保留对

14、警报器和显示器的引用。 热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引 用,自动调用警报器的MakeAlert()方法、显示器的ShowMsg()方法。 演示示例5 Heater Hands-On实训教程系列2626事件模型事件源声明 事件触发事 件条件触发通知(发布者)订阅者侦听执行 方法通知订阅者侦听执行 方法事件的概念l事件:是类(或类的实例)在发生其某些特殊的事情 时用来通知其他对象的一种方式 Hands-On实训教程系列什么是程序集为什么只运行这个.exe文件就能使用我们程序的所有功能?Hands-On实训教程系列什么是程序集l .NET框架应用程序的生成块l包

15、含编译好的代码的逻辑单元l创建的每个项目文件(project)都会产生一个程 序集dlll程序集的结构程序集清单类型元数据IL代码资源向其他应用程序公开,并由这些应用程序使用元数据是二 进制信息程序中的图片、音乐文件Hands-On实训教程系列程序集清单l程序集清单:元数据重要部分该信息用于从程序集导出的类型有关被引用程序集的信息 控制对该程序集的类型和资源的引用如 何映射到包含其声明和实现的文件类型引用信息 构成该程序集的文件程序集中所有文件的列表 如果已经为程序集提供了一个强名称,则为来自 发行者的公钥强名称信息 有关该程序集支持的区域性或语言的信息区域性 主版本号和次版本号,以及修订号和内部版本号版本号 指定程序集名称的文本字符串程序集名称 说明信息 Hands-On实训教程系列ILDasmlILDasm 反编译的工具。可以查看IL汇编代码可以看到类和方法演示: 使用ILDasm Hands-On实训教程系列Visual Studio创建程序集lVisual Studio的所有应用程

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号