匿名方法被定義為內嵌 (in-line) 方法,而不是作為任何類的成員方 法。此外,無法將方法屬性應用到一個匿名方法,並且匿名方法也不能定義一般 類型或添加一般約束。
您應該注意關於匿名方法的兩件值得關注的事情: 委托保留關鍵字的重載使用和委托指派。稍後,您將看到編譯器如何實現一個匿 名方法,而通過查看代碼,您就會相當清楚地了解編譯器必須推理所使用的委托 的類型,實例化推理類型的新委托對象,將新的委托包裝到匿名方法中,並將其 指派給匿名方法定義中使用的委托(前面的示例中的 del)。
匿名方法可 以用在任何需要使用委托類型的地方。您可以將匿名方法傳遞給任何方法,只要 該方法接受適當的委托類型作為參數即可:
class SomeClass
{
delegate void SomeDelegate();
public void SomeMethod()
{
InvokeDelegate(delegate() {MessageBox.Show("Hello");});
}
void InvokeDelegate(SomeDelegate del)
{
del();
}
}
如果需要將一個匿名方法傳遞給一個接受抽象 Delegate 參數 的方法,例如:
void InvokeDelegate(Delegate del);
則首先需要將匿名方法強制轉換為特定的委托類型。
下面是一個將匿名方 法作為參數傳遞的具體而實用的示例,它在沒有顯式定義 ThreadStart 委托或線 程方法的情況下啟動一個新的線程:
public class MyClass
{
public void LauchThread()
{
Thread workerThread = new Thread(delegate()
{
MessageBox.Show ("Hello");
});
workerThread.Start();
}
}
在前面的示例中,匿名方 法被當作線程方法來使用,這會導致消息框從新線程中顯示出來。
將參數 傳遞到匿名方法
當定義帶有參數的匿名方法時,應該在 delegate 關鍵字後面 定義參數類型和名稱,就好像它是一個常規方法一樣。方法簽名必須與它指派的 委托的定義相匹配。當調用委托時,可以傳遞參數的值,與正常的委托調用完全 一樣:
class SomeClass
{
delegate void SomeDelegate(string str);
public void InvokeMethod()
{
SomeDelegate del = delegate(string str)
{
MessageBox.Show (str);
};
del ("Hello");
}
}
如果匿名方法沒有參數,則 可以在 delegate 關鍵字後面使用一對空括號:
class SomeClass
{
delegate void SomeDelegate();
public void InvokeMethod()
{
SomeDelegate del = delegate()
{
MessageBox.Show("Hello");
};
del();
}
}