您的位置:首页 > 其它

委托与事件

2015-03-09 15:54 106 查看
   前面讲到了委托,正如上篇文章所述,委托的出现标志着事件的出现。上篇文章中我们没有用到事件,但细心的读者是否发现,无论是如何使用委托,都会在PeopleResult类中有一个委托类型的参数。

   如果去掉这个参数,代码将会变成什么样呢?

   实际应用中,通常都是 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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面向对象