版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 Hands-On实训教程系列实训教程系列 委托、事件和反射委托、事件和反射 Hands-On实训教程系列实训教程系列 回顾回顾 l读写文本文件的读写器分别是什么?读写文本文件的读写器分别是什么? lXML文件的节点可以自由扩展吗?文件的节点可以自由扩展吗? Hands-On实训教程系列实训教程系列 l实现委托实现委托 l定义和触发事件定义和触发事件 l理解程序集的概念理解程序集的概念 l理解反射的概念理解反射的概念 本章目标本章目标 Hands-On实训教程系列实训教程系列 委托委托 l函数指针函数指针 l类型安全类型安全 l用于将方法传递给其他函数用于将方法传递给其他函数 Hands-On
2、实训教程系列实训教程系列 委托的概念委托的概念 l委托是一种引用方法的类型。委托是一种引用方法的类型。 l 一旦为委托绑定(分配)了方法,委托将与该方一旦为委托绑定(分配)了方法,委托将与该方 法具有完全相同的行为。法具有完全相同的行为。 l 可以为委托绑定(分配)一个方法或多个方法,可以为委托绑定(分配)一个方法或多个方法, 绑定一个方法的委托成为单路广播委托,绑定多个方绑定一个方法的委托成为单路广播委托,绑定多个方 法的委托称为多路广播委托。法的委托称为多路广播委托。 Hands-On实训教程系列实训教程系列 委托的声明委托的声明 l访问修饰符访问修饰符 delegate (参数参数 列表
3、列表); l例如:例如: public delegate void BankEmployee( ); l注意:委托可以理解为一种类型,可以在定义类的任注意:委托可以理解为一种类型,可以在定义类的任 何地方定义委托何地方定义委托 Hands-On实训教程系列实训教程系列 委托的使用委托的使用 l使用委托包括以下步骤:使用委托包括以下步骤: 声明委托声明委托 实例化委托实例化委托 使用委托使用委托 using System; using System.Collections.Generic; using System.Text; namespace MyExample3 public class
4、A public int CalA(int a, int b) return (a + b); public class B public 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);
5、/使用委托实现加法运算使用委托实现加法运算 int t = h(5, 3); Console.WriteLine(t); /调用方法实现乘法运算调用方法实现乘法运算 int m=objB.CalB(5, 3); Console.WriteLine(m); Hands-On实训教程系列实训教程系列 函数签名与委托签名函数签名与委托签名 l函数签名由函数的返回值和参数组成。函数签名由函数的返回值和参数组成。 l函数签名与参数名无关。函数签名与参数名无关。 Hands-On实训教程系列实训教程系列 多播委托多播委托 l包含多个方法的委托称为多播委托,调用多播委托包含多个方法的委托称为多播委托,调用多
6、播委托 时会依次调用这多个方法。时会依次调用这多个方法。 l多播委托返回值必须为多播委托返回值必须为void l可以使用可以使用+=(+) 和和 -=(-) 来添加来添加/删除方法删除方法 delegate void MultipleDel( string param ); static void Main() MultipleDel operations = new MultipleDel( SomeFunc ); operations += new MultipleDel( ANotherFunc ); operations( someParam ); Hands-On实训教程系列实训教程
7、系列 什么是委托?什么是委托? Morning,Jack 你好,王小姐你好,王小姐 l接待外国客户接待外国客户 l接待中国客户接待中国客户 Hands-On实训教程系列实训教程系列 什么是委托?什么是委托? l公司业务发展了,全世界各地都有客户。怎么办?公司业务发展了,全世界各地都有客户。怎么办? break; case Language.Chinese: ChineseGreeting(name); break; Hands-On实训教程系列实训教程系列 什么是委托?什么是委托? public void GreetPeople(string name, Language lang) 参数类型
8、参数类型参数变量参数变量 假如假如GreetPeople()方法可以接受一个参数变量,这个变量可以代表另方法可以接受一个参数变量,这个变量可以代表另 一个方法,当我们给这个变量赋值一个方法,当我们给这个变量赋值 EnglishGreeting的时候,它代表着的时候,它代表着 EnglsihGreeting() 这个方法;当我们给它赋值这个方法;当我们给它赋值ChineseGreeting 的时的时 候,它又代表着候,它又代表着ChineseGreeting()方法。方法。 Hands-On实训教程系列实训教程系列 什么是委托?什么是委托? l参数变量命名为参数变量命名为 MakeGreetin
9、g MakeGreeting(name); public void GreetPeople(string name, * MakeGreeting) MakeGreeting(name); 什么类型?什么类型? Hands-On实训教程系列实训教程系列 委托委托 lMakeGreeting参数所能代表的参数所能代表的 ChineseGreeting() 和和EnglishGreeting()方法的签名:方法的签名: 应该能够确定应该能够确定 MakeGreeting可以代表的方法种类,可以代表的方法种类, 即即MakeGreeting可以代表的方法可以代表的方法 的的 参数类型和返回类型。参数
10、类型和返回类型。 public void EnglishGreeting(string name) public void ChineseGreeting(string name) MakeGreeting的的 参数类型定义参数类型定义 Hands-On实训教程系列实训教程系列 委托参数委托参数 l委托定义了委托定义了MakeGreeting参数所能代表的方法的种参数所能代表的方法的种 类,也就是类,也就是MakeGreeting参数的类型。参数的类型。 public delegate void GreetingDelegate(string name); public void GreetP
11、eople(string name, GreetingDelegate MakeGreeting) MakeGreeting(name); 演示示例演示示例2 Delegate Hands-On实训教程系列实训教程系列 小结小结 l委托是一个类,它定义了方法的类型,使得可以将委托是一个类,它定义了方法的类型,使得可以将 方法当作另一个方法的参数来进行传递,这种将方方法当作另一个方法的参数来进行传递,这种将方 法动态地赋给参数的做法,可以避免在程序中大量法动态地赋给参数的做法,可以避免在程序中大量 使用使用If-Else(Switch)语句,同时使得程序具有更好的语句,同时使得程序具有更好的 可
12、扩展性。可扩展性。 Hands-On实训教程系列实训教程系列 总结总结 l进入的委托实例时,它调用列表中的方法,委托调进入的委托实例时,它调用列表中的方法,委托调 用所使用的参数和返回的值均与该方法的对应项相用所使用的参数和返回的值均与该方法的对应项相 同。调用委托与调用方法相似。唯一的区别在于不同。调用委托与调用方法相似。唯一的区别在于不 是调用委托的实现,而是调用与委托相关联的方法是调用委托的实现,而是调用与委托相关联的方法 的实现代码。的实现代码。 Hands-On实训教程系列实训教程系列 事件事件 抢答者 宣布人宣布人 抢答者 “请听题” 集中注意力聆听 其他人 事件源 事件的发布者
13、事件的订阅人 未订阅该事件 定义事件 为对象订阅该事件 将发生的事件通知给订阅人 Hands-On实训教程系列实训教程系列 定义事件定义事件 访问修饰符 event 委托名 事件名; 语法 定义事件时,发布者首先定义委托,然后根据委托定义事件。定义事件时,发布者首先定义委托,然后根据委托定义事件。 /声明一个委托声明一个委托 public delegate void Del(); /声明一个事件声明一个事件 public event Del Click; Hands-On实训教程系列实训教程系列 订阅事件订阅事件 l订阅事件只是添加一个委托,事件引发时该委托将订阅事件只是添加一个委托,事件引发
14、时该委托将 调用一个方法。调用一个方法。 l事件可用作事件可用作 += 和和 -= 运算符左边的操作数。这些运运算符左边的操作数。这些运 算符分别用于将事件处理程序添加到所涉及的事件算符分别用于将事件处理程序添加到所涉及的事件 或从该事件中移除事件处理程序。或从该事件中移除事件处理程序。 me.Click += new MyEvent.Del(me.ClickMethod); Hands-On实训教程系列实训教程系列 if (Click != null) Console.WriteLine(引发事件:); Click(); 通知订阅对象通知订阅对象 调用订阅特定事件的对象的所有委托 Hands
15、-On实训教程系列实训教程系列 示例示例 /创建一个事件类创建一个事件类 class MyEvent /声明一个委托声明一个委托 public delegate void Del(); /声明一个事件声明一个事件 public event Del Click; /创建一个触发事件的方法创建一个触发事件的方法 public void OnClick() if (Click != null) Console.WriteLine(引发事件:引发事件:); Click(); /和事件关联的方法和事件关联的方法 public void ClickMethod() Console.WriteLine(您触
16、发了您触发了Click事件事件!); class Test static void Main(string args) MyEvent me = new MyEvent(); /给对象预定事件给对象预定事件 me.Click += new MyEvent.Del(me.ClickMethod); me.OnClick(); Hands-On实训教程系列实训教程系列 小结小结 我们有个高档的热水器,我们给它通上电,当水温超过我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:度的时候: 1、扬声器会开始发出语音,告诉你水的温度;、扬声器会开始发出语音,告诉你水的温度; 2、液晶屏也会改
17、变水温的显示,来提示水已经快烧开了。、液晶屏也会改变水温的显示,来提示水已经快烧开了。 现在写个程序来模拟这个烧水的过程:现在写个程序来模拟这个烧水的过程: 首先定义一个类来代表热水器,首先定义一个类来代表热水器,Heater,它有代表水温的字段,叫做,它有代表水温的字段,叫做 temperature;当然,还有必不可少的给水加热方法;当然,还有必不可少的给水加热方法BoilWater(),一个发出,一个发出 语音警报的方法语音警报的方法MakeAlert(),一个显示水温的方法,一个显示水温的方法,ShowMsg()。 演示示例演示示例4 Heater Hands-On实训教程系列实训教程系
18、列 事件事件 现在假设热水器由三部分组成:热水器、警报器、显示器,它们来自于不同现在假设热水器由三部分组成:热水器、警报器、显示器,它们来自于不同 厂商并进行了组装。那么,应该是热水器仅仅负责烧水,它不能发出警报也厂商并进行了组装。那么,应该是热水器仅仅负责烧水,它不能发出警报也 不能显示水温;在水烧开时由警报器发出警报、显示器显示提示和水温。不能显示水温;在水烧开时由警报器发出警报、显示器显示提示和水温。 警报器和显示器告诉热水器,它对它的温度比较感兴趣警报器和显示器告诉热水器,它对它的温度比较感兴趣(注册注册)。 热水器知道后保留对警报器和显示器的引用。热水器知道后保留对警报器和显示器的引
19、用。 热水器进行烧水这一动作,当水温超过热水器进行烧水这一动作,当水温超过95度时,通过对警报器和显示器的引度时,通过对警报器和显示器的引 用,自动调用警报器的用,自动调用警报器的MakeAlert()方法、显示器的方法、显示器的ShowMsg()方法。方法。 演示示例演示示例5 Heater Hands-On实训教程系列实训教程系列 事件模型事件模型 事件源事件源 声明声明 事件事件 触发事触发事 件条件件条件 触发触发 通知通知 (发布者)(发布者) 订阅者订阅者 侦听侦听 执行执行 方法方法 通知通知 订阅者订阅者 侦听侦听 执行执行 方法方法 事件的概念事件的概念 l事件:是类(或类的
20、实例)在发生其某些特殊的事事件:是类(或类的实例)在发生其某些特殊的事 情时用来通知其他对象的一种方式情时用来通知其他对象的一种方式 Hands-On实训教程系列实训教程系列 什么是程序集什么是程序集 为什么只运行这个为什么只运行这个.exe文件就能使用我们程序的所有功能?文件就能使用我们程序的所有功能? Hands-On实训教程系列实训教程系列 什么是程序集什么是程序集 l .NET框架应用程序的生成块框架应用程序的生成块 l包含编译好的代码的逻辑单元包含编译好的代码的逻辑单元 l创建的每个项目文件(创建的每个项目文件(project)都会产生一个程)都会产生一个程 序集序集dll l程序集
21、的结构程序集的结构 程序集清单程序集清单 类型元数据类型元数据 IL代码代码 资源资源 向其他应用程序公开,并由这些应用程序使用向其他应用程序公开,并由这些应用程序使用 元数据是二元数据是二 进制信息进制信息 程序中的图片、音乐文件程序中的图片、音乐文件 Hands-On实训教程系列实训教程系列 程序集清单程序集清单 l程序集清单:元数据重要部分程序集清单:元数据重要部分 该信息用于从程序集导出的类型该信息用于从程序集导出的类型有关被引用程序集的信息有关被引用程序集的信息 控制对该程序集的类型和资源的引用如控制对该程序集的类型和资源的引用如 何映射到包含其声明和实现的文件何映射到包含其声明和实
22、现的文件 类型引用信息类型引用信息 构成该程序集的文件构成该程序集的文件程序集中所有文件的列表程序集中所有文件的列表 如果已经为程序集提供了一个强名称,则为来自如果已经为程序集提供了一个强名称,则为来自 发行者的公钥发行者的公钥 强名称信息强名称信息 有关该程序集支持的区域性或语言的信息有关该程序集支持的区域性或语言的信息区域性区域性 主版本号和次版本号,以及修订号和内部版本号主版本号和次版本号,以及修订号和内部版本号版本号版本号 指定程序集名称的文本字符串指定程序集名称的文本字符串程序集名称程序集名称 说明说明信息信息 Hands-On实训教程系列实训教程系列 ILDasm lILDasm
23、反编译的工具。反编译的工具。 可以查看可以查看IL汇编代码汇编代码 可以看到类和方法可以看到类和方法 演示:演示: 使用使用ILDasm Hands-On实训教程系列实训教程系列 Visual Studio创建程序集创建程序集 lVisual Studio的所有应用程序都创建程序集的所有应用程序都创建程序集 AssemblyInfo.cs 用于配置程用于配置程 序集的属性序集的属性 Hands-On实训教程系列实训教程系列 AssemblyInfo.cs介绍介绍 lAssemblyInfo.cs文件文件 assembly: AssemblyTitle(My News Reader) assem
24、bly: AssemblyDescription() assembly: AssemblyConfiguration() assembly: AssemblyCompany(Jade Bird) assembly: AssemblyProduct(My News Reader) assembly: AssemblyCopyright(版权所有版权所有 (C) Jade Bird 2007) assembly: AssemblyTrademark() assembly: AssemblyCulture() assembly: AssemblyVersion() assembly: AssemblyFileVersion() Hands-On实训教程系列实训教程系列 程序集与程序集与 internal 访问修饰符访问修饰符 linternal修饰符用于程序集级别指定访问性修饰符用于程序集级别指定访问性 linternal修饰的成员不能被其它程序集访问修饰的成员不能被其它程序集访问 可以可以可以可以可以可以可以可以可以可以public 不可以不可以不可以不可以可以可以可以可以可以可以internal 不
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合规转利润:降本增效全指南(2026)《GBT 39324-2020智能水电厂主设备状态检修决策支持系统技术导则》
- 合规转利润:降本增效全指南(2026)《GBT 39266-2020工业机器人机械环境可靠性要求和测试方法》
- 合规转利润:降本增效全指南(2026)《GBT 39118-2020激光指示器产品光辐射安全要求》
- 2026年浙江省人教版初中数学九年级下册第7章概率统计习题
- 2026年浙江省高中数学选修2-7第4章数列习题
- 合规转利润:降本增效全指南(2026)《GBT 38706-2020陶瓷行业能源管理体系实施指南》从合规成本到利润增长全案:避坑防控+降本增效+商业壁垒构建
- 动物性食品卫生检验课件
- 第9章 计算机图形学
- 第36讲 电离平衡
- 管道维护健康宣教
- 生漆棺材施工方案
- 医院6s考试试题及答案
- 切割机安全培训课件
- 瓷盘画制作步骤教学课件
- 清洁小家电劳动课课件
- 表面织构热效率提升-洞察及研究
- 吸痰技术操作并发症预防和处理
- 儿童OT训练课件
- 2025-2026学年小学四年级上学期班主任工作计划
- JG/T 491-2016建筑用网格式金属电缆桥架
- CJ/T 152-2016薄壁不锈钢卡压式和沟槽式管件
评论
0/150
提交评论