C# 中的委托与事件

委托与事件是C#中的重要概念,这两个概念既有联系又有区别,容易混淆,下面就对C#中的这两个概念进行一下比较。

1.委托

声明委托的语法和声明函数非常类似,不过需要使用delegate关键字,并没有函数体。例如,以下代码声明了一个委托:

public delegate double ProcessDelegate(double param1, double param2);

这个委托声明了一个名为ProcessDelegate的,返回值为double,接收两个double类型的参数的函数原型,而且这个委托是public的,具有全局访问权限。委托是一个类型,就像int、double一样,都是类型名,要声明一个委托型变量,应该再写:

ProcessDelegate process;

这样就声明了一个ProcessDelegate型的变量process。这个变量有点类似与函数指针,能指向任何一个符合ProcessDelegate原型的函数。例如:

double Multiply(double param1,double param2) {         return param1 * param2; }

process = new ProcessDelegate(Multiply);

Multiply是一个符合ProcessDelegate委托原型的函数,process这个委托变量可以“指向”它,利用了一个稍显古怪的语法:process = new ProcessDelegate(Multiply);这个语法是委托所特有的,它采用了new关键字,然后接委托类型,然后把要指向的函数名放在一个括号里。可以利用一个简单的语法来实现:

process=Multiply;

这两个语法是等价的,都把process这个委托变量“指向”了Multiply。

然后,

既然process已经“指向”了Multiply,任何使用Multiply的地方都能用process代替,例如process(1,2)这个语句和Multiply(1,2)是等价的。

2.事件

事件的实现需要利用委托。我们拿一个自定义事件为例进行说明。

public class Connection

{

        public delegate void MessageHandler(string messageText);

        public event MessageHandler MessageArrived;

}

以上语句声明了一个事件MessageArrived,声明事件之前我们先声明了一个名为MessageHandler的委托。可以看出,与委托有明显的区别,事件不是一个类型,而是类的一个成员,是属于类的,和字段、属性、方法一样,都是类的一部分。声明MessageArrived事件需要使用关键字event,并在前面加上委托类型的名称,如果不加关键字event就和上文所述的声明委托变量一样了。事件前面的委托类型说明,处理事件的函数必须符合委托所指定的原型形式。

MessageArrived("Hello Mun!");语句使程序“抛出”一个事件,就像“抛出”一个异常一样。然而,事件并不需要外界使用try...catch语句捕获,而是该类的实例捕获。在另一个程序中,通过代码:

Connection myConnection = new Connection();

myConnection.MessageArrived += new MessageHandler(DisplayMessage);

public void DisplayMessage(string message){      Console.WriteLine("Message arrived:{0}", message);}

进行捕获。其中关键在于:myConnection.MessageArrived += new MessageHandler(DisplayMessage);就像委托“指向”了一个函数一样,为事件添加了一段事件处理程序。每当事件被触发时,就会调用DisplayMessage函数进行事件处理。

以上就是委托与事件的基本联系与区别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值