如果要阅读这篇文章,建议先读我的文章委托,如果你已了解委托,那么忽略这段话即可。
事件这一词,听着高大上,事实上它是什么呢?
首先它是一个关键词,与virtual、delegate、public等一样,它的写法是event。
我们看下面两端代码:
public delegate void PlayHandle();
public PlayHandel playEvent;
第一段代码:
第一行声明了一个委托类型PlayHandle
第二行声明了一个委托变量playEvent
之后我们给playEvent赋值即可间接调用绑定的方法
public delegate void PlayHandle(Object sender,EventArgs e);
public event PlayHandel playEvent;
第二段代码:
与第一段很相似,第一行仍是声明了一个委托类型PlayHandle,不过上面是无参的,我们这里有两个参数。
为什么是这两个参数呢?
第一个参数是Object类型,作为事件的发送者。第二个参数是事件的参数类型, 就是把参数也封装成类,以后不管有几个参数,0个,2个,8个,我们都用这一个参数代表这些参数。这是一个规定,方便事件的使用。
第二行呢,在原先的基础上加了event关键字,这就创建好了一个事件。
有无event的区别是什么呢?
- 无event:playEvent可以直接赋值(使用=),也可以绑定方法(使用+=),但可以在类外任何时候随便调用。
- 有event:playEvent必须要绑定方法(使用+=),不能在类外调用。
为了更好的理解,我们看看下面的原码,需求是张老师让机器人代打篮球
Teacher.cs
class Teacher
{
public delegate void PlayHandel(Object sender,EventArgs e);
public event PlayHandel playEvent;
public void Play()
{
playEvent(this, new EventArgs());
}
}
Robot.cs
class Robot
{
public void Play(Object sender,EventArgs e)
{
Console.WriteLine("机器人在打篮球");
}
}
Program.cs
class Program
{
static void Main(string[] args)
{
Teacher zhang = new Teacher();
Robot robot = new Robot();
zhang.playEvent += robot.Play;
zhang.Play();
}
}
此时有event修饰,我们不可以直接调用playEvent,如果调用,会报这样的错。
如果没有event,那么这个错误不会出现,你可以任意的调用,这样便不合理。