不少书中喜欢把委托和事件放到一个高度上来讲述,这就造成了初学者会对这两者关系产生疑惑,委托和事件似乎没什么区别。
其实.net中的事件就是微软提供给我的语法糖,目的是为了减少代码量,其实事件的相关功能都能用委托做出来。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
public class Person
{
public delegate void PersonWorkHandle(string msg);
public event PersonWorkHandle WorkEnd;
public void DoWork()
{
WorkEnd("Person中我的工作完成了");
}
}
public class Person1
{
public delegate void PersonWorkHandle(string msg);
private PersonWorkHandle WorkEnd;
public void add_WorkEnd(PersonWorkHandle value)
{
WorkEnd += value;
}
public void remove_WorkEnd(PersonWorkHandle value)
{
WorkEnd -= value;
}
public void DoWork()
{
WorkEnd("Person1中我的工作完成了");
}
}
class Program
{
static void Main(string[] args)
{
//直接使用事件
Person p = new Person();
p.WorkEnd += WorkEndHandle;
p.DoWork();
//委托模拟事件
Person1 p1 = new Person1();
p1.add_WorkEnd(WorkEndHandle);
p1.DoWork();
Console.ReadLine();
}
static void WorkEndHandle(string msg)
{
Console.WriteLine(msg);
}
}
Person中采用的是触发事件来通知调用者,我的工作做完了. WorkEnd就是事件
Person1中没用事件,纯粹的委托方法,完全达到了事件的目的.
如果你用IL 反汇编程序看下生成的代码 你会发现我Person和Person1中的代码是类似的
实际上我的Person1就是模拟了CLR自动生成的委托代码,你在Person看到那个WorkEnd事件,在被编译的时候就是自动生成了私有变量委托,和add_ remove_ 方法
采用事件写的代码 减少了代码量 好处就是这个 比如这里的
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
private PersonWorkHandle WorkEnd;
public void add_WorkEnd(PersonWorkHandle value)
{
WorkEnd += value;
}
public void remove_WorkEnd(PersonWorkHandle value)
{
WorkEnd -= value;
}
用一句
public event PersonWorkHandle WorkEnd;
就能代替
另外注册事件处理程序的时候可以很方便的用+=运算符
总之,事件就是委托的一个特殊应用罢了,没什么神秘的地方