類別外部僅能對事件使用 += / -= 運算子,結果為 void。此規則禁止外部代碼直接檢查或修改事件底層委派欄位。
public class LoginDialog : Form
{
Button OkButton, 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) { /* 處理 */ }
void CancelButtonClick(object sender, Event e) { /* 處理 */ }
}
大量事件若各佔一欄位會浪費記憶體。可宣告事件屬性,內部以鍵值對存儲委派:
class Control : Component
{
static readonly object mouseDownEventKey = new object();
static readonly object mouseUpEventKey = new object();
protected Delegate GetEventHandler(object key) { ... }
protected void SetEventHandler(object key, Delegate handler) { ... }
public event MouseEventHandler MouseDown
{
get { return (MouseEventHandler)GetEventHandler(mouseDownEventKey); }
set { SetEventHandler(mouseDownEventKey, value); }
}
public event MouseEventHandler MouseUp
{
get { return (MouseEventHandler)GetEventHandler(mouseUpEventKey); }
set { SetEventHandler(mouseUpEventKey, value); }
}
}
底層儲存可設計為「無處理器不佔空間」,達到空間與時間的平衡。