委托与事件
2015-03-09 15:54
106 查看
前面讲到了委托,正如上篇文章所述,委托的出现标志着事件的出现。上篇文章中我们没有用到事件,但细心的读者是否发现,无论是如何使用委托,都会在PeopleResult类中有一个委托类型的参数。
如果去掉这个参数,代码将会变成什么样呢?
实际应用中,通常都是 PeopleResult在一个类中,AddOpen和 SubOpen(加减法的运算方法)在另外的类中。
此处是将方法绑定到委托,对比不使用事件时,绑定方法,如下:
不使用事件:
添加事件后:
发现:不使用事件,绑定加法运算方法,直接“=”即可;而使用事件后,绑定加法运算,必须使用“+=”,如果使用“=”就会报错。
为什么会出现这种情况呢?
用一个图(委托和事件的使用流程图)来说明问题:
对比发现:前三步都一样,只有最后一步调用的时候,适用范围不同,委托在对象内部和外部都可以调用,而事件只能在对象内部调用。
恍然大悟:action事件确实是一个GenericFun类型的委托,只不过不管是不是声明为public,它总是被声明为private,不能被对象外部调用。
总结
在程序中创建并使用自定义事件包含3个步骤:1、必须在类中声明事件并确定将要使用的委托和参数;2、必须定义在触发事件时要调用的委托;3、必须设计事件的参数类,该参数类的实例会将信息传递给被调用的方法。
声明一个事件语法与声明一个委托极其相似,二者唯一的区别就是关键字的不同。其实,可以把事件看成是委托的特例,事件没有返回值。虽然一般用public关键字修饰,但是事件无法再外部触发,而委托可以在外部直接调用。
推荐博客:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx
如果去掉这个参数,代码将会变成什么样呢?
实际应用中,通常都是 PeopleResult在一个类中,AddOpen和 SubOpen(加减法的运算方法)在另外的类中。
namespace NoDelegate { //定义委托 public delegate int GenericFun(int a, int b); //人操作类 public class Operator { //定义事件 public event GenericFun action; //结果 public int PeopleResult(int a, int b) { int result = 0; if (action != null) { result = action(a, b); } return result; } } //计算器类 public class Calculator { //加法运算 public int AddOpen(int a, int b) { return a + b; } //减法运算 public int SubOpen(int a, int b) { return a - b; } } class Program { static void Main(string[] args) { Operator oper = new Operator(); Calculator cal = new Calculator(); //将方法绑定到委托 oper.action += new GenericFun(cal.AddOpen); //绑定加法运算 Console.WriteLine("最终相加结果是:" + oper.PeopleResult(4, 3)); oper.action += new GenericFun(cal.SubOpen); //绑定减法运算 Console.WriteLine("最终相减结果是:" + oper.PeopleResult(4, 3)); Console.Read(); } } }
此处是将方法绑定到委托,对比不使用事件时,绑定方法,如下:
不使用事件:
添加事件后:
发现:不使用事件,绑定加法运算方法,直接“=”即可;而使用事件后,绑定加法运算,必须使用“+=”,如果使用“=”就会报错。
为什么会出现这种情况呢?
用一个图(委托和事件的使用流程图)来说明问题:
对比发现:前三步都一样,只有最后一步调用的时候,适用范围不同,委托在对象内部和外部都可以调用,而事件只能在对象内部调用。
恍然大悟:action事件确实是一个GenericFun类型的委托,只不过不管是不是声明为public,它总是被声明为private,不能被对象外部调用。
总结
在程序中创建并使用自定义事件包含3个步骤:1、必须在类中声明事件并确定将要使用的委托和参数;2、必须定义在触发事件时要调用的委托;3、必须设计事件的参数类,该参数类的实例会将信息传递给被调用的方法。
声明一个事件语法与声明一个委托极其相似,二者唯一的区别就是关键字的不同。其实,可以把事件看成是委托的特例,事件没有返回值。虽然一般用public关键字修饰,但是事件无法再外部触发,而委托可以在外部直接调用。
推荐博客:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx
相关文章推荐
- C# 中的委托和事件
- C# 委托(Delegate) 事件(Event)应用详解
- C#中的委托与事件
- 纯js事件委托模式,委托父元素
- C# 中的委托和事件
- 事件和委托的区别
- 通过IL分析C#中的委托、事件、Func、Action、Predicate之间的区别与联系
- js中的事件委托或是事件代理使用详解
- C#通过委托调用Button单击事件的方法
- 委托与事件
- 事件 和 委托
- 事件与委托
- 委托和事件
- 委托和事件[delegate and event]_C#
- 事件处理(Handling Events)和委托(Delegate)代码示例(一)【UE4】【C++】
- 事件(多路委托、事件)
- 事件处理(Handling Events)和委托(Delegate)代码示例(二)【UE4】【C++】
- c# 委托 事件 EventHandler 观察者模式 详解,以及和java的比较
- C# 事件与委托
- 编程程序实现委托,事件。