[TOC]
用于实现事件和回调方法
存有对某个方法的引用的一种引用类型变量;引用可在运行时被改变。
//声明委托(下面的委托可被用于引用任何 带有一个单一的string参数 的方法,并返回一个int类型变量)
public delegate int Mydele(string s);
...
//创建委托实例
dele dl1 = new dele()
//使用委托对象调用方法
dl1();
例1 将委托当作参数传递
using System;
//委托声明
delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}
public static int getNum()
{
return num;
}
static void Main(string[] args)
{
/*
委托实例化(这里将委托指向AddNum方法)
***一旦声明了委托类型,委托对象必须用new关键字创建,且与一个特定方法有关
*/
NumberChanger nc1 = new NumberChanger(Addnum);
//使用委托对象调用方法
nc1(25);//-->num=35
Console.WriteLine("{0}",GetNum());//-->35
}
}
}
例2 委托的订阅模式
static void Main(string[] args)
{
NumberChanger nc = null;
nc+=AddNum;
}
事件委托,用于处理不具有事件数据的事件的方法,将方法当作参数传递。在c#中基于委托模型,遵守观察者模式,使订阅者能够向提供方注册并接收相关通知。
//声明一个委托
public delegate void NameEventHandler(object sender,EventArgs e);
//为委托定义一个事件(event->事件;EventHandler->委托)
public event EventHandler theEventName;
//创建一个引发事件方法
protected virtual void onEventName(EventArgs e)
{
EventHandler handler = onEventName;
if (handler != null)
{
handler(this,e);
//sender=this:事件触发对象是它本身;e:记录了事件传递过来的额外信息
}
}
//定义一个事件处理程序方法
static void Solvement(object sender,EventArgs e)
{
Console.WriteLine("it is reached.");
}
//为事件附加事件处理程序