事件(Event)

 

   上次介紹了委派delegate,委派常常會和事件event一起使用, 事件event指的是使用者所做的動作,例如鍵盤輸入、滑鼠點擊等。

   其實事件有點像是訂閱的概念,在事件發生的時候,會通知訂閱者,然後訂閱者就會有動作,也就是執行方法。

   用程式說明大家可能會比較清楚。

 

下面我用一個見面跟人打招呼的程式做為範例,來向大家介紹甚麼是事件?

範例程式如下:

public delegate void PersonEventHandler(object source, PersonEventArgs args);

 

    public class Person

    {

        private string PerName, PerNation;

        public event PersonEventHandler PerEvent;

 

             public void Add(string name,string nation)

        {

            PerName = name;

            PerNation = nation;

 

              if (PerEvent != null)

                PerEvent(this, new PersonEventArgs(name,nation));

        }

    }

 

    public class PersonEventArgs : EventArgs

    {

              public string Name;

              public string Nation;

              public PersonEventArgs(string name, string nation)

        {

            Name = name;

            Nation = nation;

        }

    }

    class Program

    {

             static void Main(string[] args)

        {

            Person P1 = new Person();

            P1.PerEvent += new PersonEventHandler(SayHello);    

            P1.Add("APPLE","Taiwan");

            P1.Add("LEMON","USA");     

        }

   

        public static void SayHello(object source,PersonEventArgs args)

        {

            Console.WriteLine("Hello! I am "+args.Name+". I come from "+args.Nation);           

        }

    }

 

執行結果

Hello! I am APPLE. I come from Taiwan

Hello! I am LEMON. I come from USA

 

 

一、宣告委派

事件都會需要用到委派,由委派的物件來觸發事件,傳回值必須為void。在上面範例程式中這一行就是宣告委派。

public delegate void PersonEventHandler(object source, PersonEventArgs args);

 

二、宣告事件變數

必須 要宣告事件變數,使用event陳述式建立委派的物件,不能使用new關鍵字。在上面範例程式的這一行我們宣告了事件變數。

public event PersonEventHandler PerEvent;

 

三、在事件發送者內呼叫事件委派的物件以觸發事件

在範例中,Person為事件發送者,除了上一步驟建立事件委派的物件以外,還要觸發事件,用來觸發事件的是在Add方法內的PerEvent。第一個參數為this,這是因為事件發送者就是目前的物件。

if (PerEvent != null)

   PerEvent(this, new PersonEventArgs(name,nation));

 

四、宣告事件委派第二個參數所屬的類別

如果所宣告事件委派的第二個參數屬於System.EventArgs類別,那麼這步驟可以省略,否則就要宣告事件委派第二個參數所屬的類別。在上面的例子中,因為事件委派的第二個參數屬於PersonEventArgs,所以需要另外宣告PersonEventArgs類別。

    public class PersonEventArgs : EventArgs

    {

        public string Name;

        public string Nation;

        public PersonEventArgs(string name, string nation)

        {

            Name = name;

            Nation = nation;

        }

    }

 

五、宣告與連結事件程序

最後要做的就是宣告與連結事件程序,就好像訂閱,在事件發生的時候,會通知訂閱者,然後訂閱者就會有動作,也就是執行方法。

class Program

    {

        static void Main(string[] args)

        {

            Person P1 = new Person();

            P1.PerEvent += new PersonEventHandler(SayHello);     //訂閱事件

            P1.Add("APPLE","Taiwan");

            P1.Add("LEMON","USA");     

        }

   

        public static void SayHello(object source,PersonEventArgs args)

        {

            Console.WriteLine("Hello! I am "+args.Name+". I come from "+args.Nation);           

        }

    }

 

以上就是關於事件的介紹,要學習事件要先了解委派,可以先看下面的這個連結:

委派(Delegate)

 

     

 

 

 

arrow
arrow

    波羅、希夏普2020 發表在 痞客邦 留言(0) 人氣()