C# 中的委托与事件
Posted kasperskynod
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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函数进行事件处理。
以上就是委托与事件的基本联系与区别。
以上是关于C# 中的委托与事件的主要内容,如果未能解决你的问题,请参考以下文章