事件有发送者和接收方。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。 在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。.NET Framework 定义了一个特殊的类型(Delegate),该类型提供函数指针的功能。(浅显的说:例如,我要吃饭,事件的发送者是我,但我并不知道谁将做饭给我吃,是妻子呢,还是老妈呢,还是老爸呢等等。所以引出了委托,就是这个事件交给谁做。
委托好比一个指挥官,指向妻子,妻子做,指向老妈,老妈做)
Public delegate [返回值] delegatename(委托的名字)(参数列表……..)
Public event DelegateName(自定义的一个委托) MyClick;
事件是一种特殊的委托,因为事件是对委托的封装,就像字段被封装成属性,因为对于事件来讲内部永远是private的,外部只能“注册自己+=、注销自己-=”,在本类是可以用=的(赋值一个方法),外界不可以注销其他的注册者,外界不可以主动触发事件,从而起到封装的作用;而委托时可以=的,即赋值,这样委托就重新new了之前+=或者赋值的都不存在了,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这种语法。事件只能add、remove自己,不能赋值。事件只能+=、-=,不能=、不能外部触发事件。所以简单来说事件就是对委托的封装,防止外部类对其进行赋值;
namespace DelegateAndEvent
{
public delegate void GreetingDelegae(string name);
public class Manager
{
public GreetingDelegae delegate1;
public event GreetingDelegae event1;
public void Greeting(string name)
{
if (delegate1 != null)
delegate1(name);
if (event1 != null)
event1(name);
event1 = Test;//在定义事件的本类中时可以赋值的
}
public void Test(string name)
{
}
}
}
namespace DelegateAndEvent
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Manager m = new Manager();
m.delegate1 = English;//委托的话可以用=号,即赋值
m.delegate1 += Chinese;
m.delegate1 = Chinese;//如果是再加这句那么之前加的就都没有了,因为委托时public的,外部可以更改的,这是为什么要有event
//因为event外部只能+=和-=,不能赋值,只有内部才可以赋值,这样就保护了该事件成员在外部不会被new了
m.event1 += new GreetingDelegae(English);//不能=的,会出错
m.event1 += new GreetingDelegae(Chinese);
}
public void English(string name)
{
MessageBox.Show("hello," + name);
}
public void Chinese(string name)
{
MessageBox.Show("你好," + name);
}
}
}