下面的例子介紹了事件句柄如何附加到上面的類Button的實例中:
public class LoginDialog: Form
{
Button OkButton;
Button CancelButton;
public LoginDialog() {
OkButton = new Button(...);
OkButton.Click += new EventHandler(OkButtonClick);
CancelButton = new Button(...);
CancelButton.Click += new EventHandler(CancelButtonClick);
}
void OkButtonClick(object sender, Event e) {
// Handle OkButton.Click event
}
void CancelButtonClick(object sender, Event e) {
// Handle CancelButton.Click event
}
}
這裡,構造函數LoginDialog創建了兩個Button實例,並且把事件句柄附加到事件Click中。
事件成員是典型域,就像上面的Button例子中所示。在每個事件消耗一個域存儲的情況是不可接受的,一個類可以聲明事件屬性來替代事件域,並且使用私有機制來存儲基本的代表。(設想在某種情況下,大多數事件都是未處理的,每個事件使用一個域就不能被接受。使用屬性而不是域的能力允許開發人員在空間和時間上面取得一個折中方案。)
在例子中
class Control: Component
{
// Unique keys for events
static readonly object mouseDownEventKey = new object();
static readonly object mouseUpEventKey = new object();
// Return event handler associated with key
protected Delegate GetEventHandler(object key) {...}
// Set event handler associated with key
protected void SetEventHandler(object key, Delegate handler) {...}
// MouseDown event property
public event MouseEventHandler MouseDown {
get {
return (MouseEventHandler)GetEventHandler(mouseDownEventKey);
}
set {
SetEventHandler(mouseDownEventKey, value);
}
}
// MouseUp event property
public event MouseEventHandler MouseUp {
get {
return (MouseEventHandler)GetEventHandler(mouseUpEventKey);
}
set {
SetEventHandler(mouseUpEventKey, value);
}
}
}
類Control為事件提供了一種內部存儲機制。方法SetEventHandler用一個key來與代表數值相關,而方法GetEventHandler返回與key相關的當前代表。大概基本的存儲機制是按照把空代表類型與key相關不會有消耗而設計的,因此無句柄的事件不占用存儲空間。