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# 中的委托与事件的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的委托与事件

C# 中的委托与事件

快速理解C#中的委托与事件

快速理解C#中的委托与事件

快速理解C#中的委托与事件

通过IL分析C#中的委托事件FuncActionPredicate之间的区别与联系