委托与事件
一、委托(delegate)
1、委托是一种可以把引用存储为函数的类型。
2、在定义了委托后,就可以声明该委托类型的变量,接着把这个变量初始化为与委托有相同返回类型和参数类别的函数引用,之后,就可以使用委托变量调用这个函数,就像该变量是一个函数一样。
如:
double multiply(double param1, double param2)
{
Return param1*param2;
}
double divide(double param1, double param2)
{
Return param1/param2;
}
delegate double processDelegate(double param1,double param2);//定义委托类型processDelegate
processDelegate process;//声明委托类型的变量process
process = new processDelegate(multiply);//使用multiply初始化变量process
double m1 = process(1,2);//其实相当于调用multiply(1,2);
process = new processDelegate(divide);//使用divide初始化变量process
double m2 = process(1,2);//其实相当于调用divide (1,2);
3、可以把委托变量作为参数传递给一个函数,如
void executeFunction(processDelegate param)
{
param (1,2);
}
二、事件
事件由对象引发,可以订阅事件。订阅一个事件的含义是提供代码,在事件发生时执行这些代码,即事件处理程序。单个事件可供多个处理程序订阅,在该事件发生时,这些处理程序都会被调用。事件处理程序可以在该事件的对象所在的类中,也可能在其他类中。事件处理程序其实就是一个方法,其唯一的限制是它必须匹配于事件所要求的返回类型和参数,这个限制是事件定义的一部分,由一个委托指定。具体可以参照如下的代码及注释:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
namespace TestEvent
{
public delegate void messageHandler(string messageText);//定义委托类型messageHandler
public class connection
{
public event messageHandler messageArrived;//定义事件成员,并使用委托类型messageHandler指定事件处理方法必须拥有的返回类型和参数
private Timer pollTimer;
public connection()
{
pollTimer = new Timer(100);
pollTimer.Elapsed += new ElapsedEventHandler(checkForMessage);//为pollTimer对象的Elapsed事件添加处理方法,即订阅事件
}
public void connect()
{
pollTimer.Start();
}
public void disConnect()
{
pollTimer.Stop();
}
private static Random random = new Random();
private void checkForMessage(object source, ElapsedEventArgs e)
{
Console.WriteLine("checking for new messages.");
if ((random.Next(9) == 0) && (messageArrived != null))
{
messageArrived("Hello Event!");//触发messageArrived事件
}
}
}
public class display
{
public void displayMessage1(string message)
{
Console.WriteLine("Message arrived displayMessage1:{0}", message);
}
public void displayMessage2(string message)
{
Console.WriteLine("Message arrived displayMessage2:{0}", message);
}
}
class Program
{
static void Main(string[] args)
{
connection myConnection = new connection();
display myDisplay = new display();
//为myConnection对象的messageArrived事件添加处理方法(对象myDisplay的displayMessage1方法)
myConnection.messageArrived += new messageHandler(myDisplay.displayMessage1);
//可以为messageArrived事件添加其它处理方法,如myDisplay的displayMessage2方法,
//在第一个处理方法执行完成之后执行此处理方法
myConnection.messageArrived += new messageHandler(myDisplay.displayMessage2);
myConnection.connect();
Console.ReadKey();
}
}
}