然而,如果您將 delegate 關鍵字 與後面的空括號一起忽略,則您將定義一種特殊的匿名方法,它可以指派給具有 任何簽名的任何委托:
class SomeClass
{
delegate void SomeDelegate(string str);
public void InvokeMethod()
{
SomeDelegate del = delegate
{
MessageBox.Show("Hello");
};
del("Parameter is ignored");
}
}
明顯地,如果匿名方法並不依賴於任何參數,而且您想要使用這種與 委托簽名無關的方法代碼,則您只能使用這樣的語法。注意,當調用委托時,您 仍然需要提供參數,因為編譯器為從委托簽名中推理的匿名方法生成無名參數, 就好像您曾經編寫了下面的代碼(在 C# 偽碼中)一樣:
SomeDelegate del = delegate(string)
{
MessageBox.Show("Hello");
};
此外,不帶參數列表的匿名方法不能與指出 參數的委托一起使用。
匿名方法可以使用任何類成員變量,並且它還可以 使用定義在其包含方法范圍之內的任何局部變量,就好像它是自己的局部變量一 樣。圖 7 對此進行了展示。一旦知道如何為一個匿名方法傳遞參數,也就可以很 容易地定義匿名事件處理,如圖 8 所示。
因為 += 運算符僅僅將一個委 托的內部調用列表與另一個委托的內部調用列表連接起來,所以可以使用 += 來 添加一個匿名方法。注意,在匿名事件處理的情況下,不能使用 -= 運算符來刪 除事件處理方法,除非將匿名方法作為處理程序加入,要這樣做,可以首先將匿 名方法存儲為一個委托,然後通過事件注冊該委托。在這種情況下,可以將 -= 運算符與相同的委托一起使用,來取消將匿名方法作為處理程序進行注冊。
Figure 7Local Variable in Anonymous Method Code
class SomeClass
{
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);
};
del("Juval");
}
}
圖 7
Figure 8Anonymous Method as Event Handler
public class MyForm : Form
{
Button m_MyButton;
public MyForm()
{
InitializeComponent();
m_MyButton.Click += delegate(object sender,EventArgs args)
{
MessageBox.Show("Clicked");
};
}
void InitializeComponent()
{...}
}