委托和事件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EventHandler 委托的实现
C#
要在 C# 中预订事件处理程序,可使用 Addition Assignment 运 算符(+=)将方法添加到分配给事件的 EventHandler 委托中。
人
血压
吃肉 :血压+5;
中风:事件
老婆: 处理该人的中风事件:掐人中 路人甲: 处理该人的中风:呼叫120
{
} public static void SecondHandler(Dog sheepDog) { } static void Main(string[] args) { HandlerMethod handler1 = FirstHandler; HandlerMethod handler2 = SecondHandler; } }
要将代码块传递为委托参数,创建匿名方法则是唯一 的方法。
通过使用匿名方法,由于不必创建单独的方法,因此 减少了实例化委托所需的编码系统开销。
button1.Click += delegate(System.Object o, System.EventArgs e)
{ System.Windows.Forms.MessageBox.Show("Click!"); };
GetInvocationList 方法
Remove 方法
RemoveAll 方法
增强委托行为
使用新的 C# 2.0技术增强委托行为
C# 2.0 对委托的语言进行了某些增强,引入了匿名方法、协 变和逆变。
匿名方法 * 协变 逆变
匿名方法
能够省略参数列表,意味着可以将匿名方法转换为带 有各种签名的委托。
使用委托的步骤 :
步骤1:声明委托。
步骤2:创建 类,创建委托调用的方法 。
步骤3:调用委托,进而调用指向的方法。
委托的广播
单路广播:一个委托,只指向一个方法 多路广播:一个委托,指向多个方法 累加 +=
减法 -=
注意:一般不使用返回值,如果有返回值, 以最后一个调用的方法为准 如果希望得到指向几个方法,使用 GetInvocationList 方 法
请选择所有符合条件的答案。 A.Control B.Object
C.EventArgs
D. Sender
习题
4. 若要通过使用 EventArgs 类将数据从事件发布 者发送到事件的预订者,你将如何操作? 请选择一个最佳答案。
A.创建一个继承自 System.EventArgs 的自定义 EventArgs 类,并将新类作为自定义 EventHandler 委托声明的第二个参数的类型包 含在声明中
习题(续)
D. [C#] public delegate object SortObjects(control objA, _ control objB); public control SortObjects(object objA, object objB);
习题
3. EventHandler 类的预定义对象使用两 个标准参数。以下哪些选项表示这些 参数的类型?
第1章 委托和事件
委托 事件 小结 实验
习题
小结
本章主要介绍了.NET Framework的委托和事件。 .NET Framework使用委托来实现事件驱动机制。 委托是一个方法列表,调用委托的效果等同于 调用此列表中所有的方法。事件可以看成是特 殊的委托实例。
第1章 委托和事件
委托 事件 小结 实验
Target 属性
Combine 方法
将委托数组的调用列表串连在一起的静态方法。可使用该方法将多个 委托的调用列表组合到一个委托中。
CreateDelegate 方法
可用来创建引用实例或静态(VB.NET中为共享)方法的委托的静态方 法。
Delegate类的成员 (续)
续表:
DynamicInvoke 方法 该方法调用委托的调用列表中的方法。被调用的方法的参数以数 组的形式传递。如果委托不使用参数,则参数数组应为 Null。 该方法返回一个单路广播委托数组,表示当前委托的调用列表。 如果委托只引用一个方法,则该数组将仅包含一个引用其自身的 元素。如果委托为多路广播,则该数组包含多个元素。 将指定委托的调用列表的最后一个实例从另一个委托中移除的静 态方法。 将指定委托的调用列表的所有实例从另一个委托中移除的静态方 法。
使用 Event 语句创建事件
.NET Framework 提供 Event 语句,可以在需要创 建自定义事件时使用该语句。 使用C#实现
在C#中,始终使用委托签名声明事件,但是也可使用诸如 EventHandler等预定义的委托或具有特定签名的自定义委托。
气球
最大容积 充气(int 体积) 爆炸:事件 小孩 玩具气球 打气 听到爆炸(事件处理程序) 1.定义处理事件的委托 2.在类内部定义事件,指定事件处理的委托类型 3.在类内部在适当的时候触发事件 4.在类外部(也可以在内部)注册类的事件处理程序
当用户在 UI 中单击自定义控件时,该控件就会触 发 Click 事件。
事件的工作方式
在程序中创建并使用自定义事件包含三个步骤 :
首先,必须在类中声明事件并确定将要使用的委托和参数 。 其次,必须定义在触发事件时要调用的委托。 最后,必须设计事件参数类,该参数类的实例会将信息传递给 被调用的方法。
逆变:允许方法具有的派生参数类型比委托类型中的更少
class Mammal { } class Dog : Mammal { } class Program { public delegate void HandlerMethod(Dog sampleDog); public static void FirstHandler(Mammal elephant)
习题(续)
B.
[C#] public delegate control SortObjects(control objA, control objB); public object SortObjects(object objA, object objB);
C.
[C#] public delegate control SortObjects(object objA, object objB); public object SortObjects(control objA, control objB);
delegate void Del(int x);
Del d = delegate(int k) { System.Windows.Forms.MessageBox.Show(k.ToString()); };
协变:允许方法具有的派生返回类型比委托中定义的更多
class Mammals { } class Dogs : Mammals static void Main() { HandlerMethod handler1 = FirstHandler;
C.委托有助于一次调用多个方法
D.委托有助于在异步编程中指定回调
习题(续)
2. 你正在创建允许用户构建自定义图形用户界面 (GUI)的程序。你必须能对派生自 Control 类的 各类自定义控件的实例进行排序。Control 类继 承于 System.Object 类。以下哪个委托和方法签 名正确使用了协变和逆变? 请选择一个最佳答案。 A. [C#] public delegate object SortObjects(object objA, object objB); public control SortObjects(control objA, control objB);
第1章 委托和事件
委托 事件 小结 实验
习题
事件Event
使用事件的好处 事件的工作方式 使用 Event 语句创建事件 EventHandler 委托的实现方法 自定义事件参数类 事件和委托的关系
使用事件的好处
.NET Framework 通常会在对象发生某些情况时自动 引发预构建的事件作为响应。
B.扩展事件发布者的类以包含作为类的属性的 数据 C.扩展事件预订者的类以包含作为类的属性的 数据
D. 声明一个自定义的 EventHandler 类,该类使用 想要作为第二个参数传递的数据的数据类型
习题
5. 若想在运行时向特定事件的 EventHandler 委托 添加几个方法,你将使用以下哪条语句呢? 请选择一个最佳答案。
委托:方法的指针,通过调用委托,就能调用方法(一到多 个) 定义的语法 创建委托:构造函数 调用(有返回,和无返回) 广播:语法:+=,-=
使用委托VS抽象类,接口区别
Delegate类的成员
Delegate类的成员
成员 Method 属性 描述 返回委托引用的方法的只读属性。如果委托引用了多个方法,则 Method 属性将返回委托的调用列表中的最后一个方法。 返回包含委托引用的方法的对象的只读属性。如果方法是静态的,则 返回的值为 null。如果委托引用了多个方法,则 Target 属性将返回包 含调用列表中最后一个方法的对象。
习题
实验
1.小猫会叫,老鼠听到会跑开,主 人听到会醒过来 2.狗也会叫,小偷听到就逃走,主 人听到就起来查看是否失窃
第1章 委托和事件
委托 事件 小结 实验
习题
习题
1. 你最近已阅读了有关在面向对象的编程中使 用委托的资料,经理要求你对其他编程人员 作个讲解。因此要创建一个有关委托的优点 列表以说服其他编程人员使用委托,那么你 打算向列表中添加使用委托的哪些优点? 请选择所有符合条件的答案。 A.委托允许将方法作为参数传递给其他方法 B.委托有助于更改方法的签名
{
} class Program { public delegate Mammals HandlerMethod(); } }
HandlerMethod handler2 = SecondHandler;
p百度文库blic static Mammals FirstHandler()
{ return null; } public static Dogs SecondHandler() { return null; }
A.C# 中使用 -=
B.C# 中使用 +=
员工都在监听老板的发彪事件,以做出相应的处理 事件参数:发彪事件(倒霉的人,时间) 事件发起人:老板 能处理事件的人:在职员工 员工离职后,不再监听事件
自定义事件参数类
可以使用继承自 EventArgs的类将参数传递给处理事件 的方法 。
每当想要将来自事件发布者的特定数据传递给预订者方法时, 就必须使用继承自 EventArgs 基类的自定义类。
如果想要允许来自事件处理程序的反馈,可以提供一个可读/写 的属性。
事件和委托的关系
事件和委托的使用流程
第1章 委托和事件
目标
本章学习目标: 使用 Delegate 类控制组件间的交互
使用 Event 语句、EventHandler委托和EventArgs 类控制组件间的交互
第1章 委托和事件
委托 事件 小结 实验
习题
委托:多态(方法的多态)
委托是引用类型,这与类和接口相似 。
间接调用方法
使用 Delegate 类间接调用方法