【學習C#】簡單理解事件

如果要閱讀這篇文章,建議先讀我的文章委託,如果你已瞭解委託,那麼忽略這段話即可。

事件這一詞,聽着高大上,事實上它是什麼呢?
首先它是一個關鍵詞,與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,那麼這個錯誤不會出現,你可以任意的調用,這樣便不合理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章