如果要閱讀這篇文章,建議先讀我的文章委託,如果你已瞭解委託,那麼忽略這段話即可。
事件這一詞,聽着高大上,事實上它是什麼呢?
首先它是一個關鍵詞,與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,那麼這個錯誤不會出現,你可以任意的調用,這樣便不合理。