在《C# 高級編程》等經典教材中,常見使用匿名方法訂閱事件的範例。然而,初學者若直接模仿書中片段,極易遇到編譯錯誤。本文針對典型錯誤進行分析,並給出正確的多種寫法。
btnOne.Click += new EventHandler(lblInfo.Text = "button1 was pressed.";);
編譯器報錯:
))原因:EventHandler 委托簽名為 void (object sender, EventArgs e),但代碼直接傳入一條賦值語句,而非方法或匿名方法,語法結構不合法。
btnOne.Click += new EventHandler(delegate(object sender, EventArgs e)
{
lblInfo.Text = "button1 was pressed.";
});
或省略參數列表(若不使用參數):
btnOne.Click += new EventHandler(delegate
{
lblInfo.Text = "button1 was pressed.";
});
btnOne.Click += new EventHandler(SetText);
private void SetText(object sender, EventArgs e)
{
lblInfo.Text = "button1 was pressed.";
}
btnOne.Click += (sender, e) => lblInfo.Text = "button1 was pressed.";
若不需要參數,可寫作 () => lblInfo.Text = "..."。
| 寫法 | 適用版本 | 備註 |
|---|---|---|
delegate { ... } | C# 2.0+ | 可省略參數列表;若需參數必須完整匹配委托簽名 |
delegate(object s, EventArgs e) { ... } | C# 2.0+ | 顯式聲明參數,最清晰 |
| 具名方法 | 所有版本 | 便於複用、除錯、移除訂閱 |
(s, e) => ... | C# 3.0+ | 語法最簡潔,推薦現代專案使用 |
EventHandler 簽名為 (object sender, EventArgs e),匿名方法參數必須匹配或省略。new EventHandler(...) 內,必須包裹在 delegate { } 或 Lambda 中。