事件(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);
}
}
以上就是關於事件的介紹,要學習事件要先了解委派,可以先看下面的這個連結:
留言列表