委托
什么是委托
委托是一种引用类型,它是函数指针的托管版本。在C#中,委托是一种可以把引用存储为函数的类型。委托可以引用实例和静态方法,而函数指针只能引用静态方法。委托的声明非常类似于函数,和函数不同的的是委托不带函数体,并且需要Delegate关键字。委托的声明指定了一个函数签名,其中包含参数列表和和一个返回类型。在定义了委托后,就可以声明该委托类型的变量,然后可以将这个变量初始化为与该委托有相同签名的函数进行引用,随后可以使用委托变量调用该函数。
委托虽然与函数指针非常相似,但却不是指针。许多人把.NET中的委托理解为安全的函数指针,这是比较牵强的,委托实现的功能和函数指针非常类似的一点就是提供了程序回调机制。
流程
1、声明委托类型
2、有一个方法包含了执行的代码
3、创建委托实例
4、调用委托实例
using System;
namespace ConsoleApp
{
class Program
{
delegate void MyDelegate();
static void Main(string[] args)
{
MyDelegate myDelegate = Method1;//委托静态方法Method1
myDelegate += new Program().Method2;//委托实例方法Method2
myDelegate.Invoke();//调用委托链上的所有方法
Console.ReadKey();
}
static void Method1() {
Console.WriteLine("method1 invoked");
}
void Method2() {
Console.WriteLine("method2 invoked");
}
}
}
事件
事件就是一个特殊的委托,是对委托做了一个封装。
声明事件
//public event 委托名 事件名称
public event MyDelegate EventMyDel;
using System;
namespace ConsoleApp1
{
public class PublishEvent
{
public delegate void NoticeHandler(string message);
public event NoticeHandler NoticeEvent;
public void Works()
{
//触发事件
if (NoticeEvent != null)
{
//传递事件及参数
NoticeEvent("Notice发布的报警信息!");
}
}
}
public class SubscribEvent
{
public SubscribEvent(PublishEvent pub)
{
//添加处理函数到委托链
pub.NoticeEvent += PrintResult;
}
void PrintResult(string message)
{
Console.WriteLine(string.Format("HELLO WORLD"));
}
}
class Program
{
static void Main(string[] args)
{
PublishEvent publish = new PublishEvent();
SubscribEvent subscrib = new SubscribEvent(publish);
//触发事件
publish.Works();
Console.Read();
}
}
}