省略 `delegate()` 的空括號,定義「與任何委派簽名相容」的匿名方法:
SomeDelegate del = delegate
{
MessageBox.Show("Hello");
};
del("Parameter is ignored"); // 呼叫時仍需提供參數,編譯器生成隱藏參數
限制:方法體不可依賴任何參數;不可用於 `out/ref` 參數委派。
匿名方法可直接存取:
string m_Space = " ";
delegate void SomeDelegate(string str);
public void InvokeMethod()
{
string msg = "Hello";
SomeDelegate del = delegate(string name)
{
MessageBox.Show(msg + m_Space + name); // 捕獲 msg、存取 m_Space
};
del("Juval");
}
直接用 `+=` 註冊:
m_MyButton.Click += delegate(object sender, EventArgs args)
{
MessageBox.Show("Clicked");
};
移除限制:`-=` 無法直接移除匿名方法(每次生成新委派實例)。解決:先存入變數再註冊/移除。
EventHandler handler = delegate { MessageBox.Show("Clicked"); };
button.Click += handler;
// 稍後
button.Click -= handler;