匿名函式 (C# 程式設計手冊)
更新:2007 年 11 月
如同其他文件所述,委派 (Delegate) 是一種包裝方法呼叫的型別。委派執行個體 (Instance) 可以在方法之間以處理型別的方式來傳遞,而且可以像方法一樣進行叫用 (Invoke)。匿名函式是指可以在任何需要委派型別 (Delegate Type) 的位置上使用的「內嵌」(Inline) 陳述式 (Statement) 或運算式。您可以用這種函式來初始化具名的委派,或是用它取代具名委派型別來傳遞做為方法參數。
匿名函式可分為兩種,我們將在下列主題中個別加以討論:
-
注意事項: Lambda 運算式可以繫結至運算式樹狀架構,也可以繫結至委派。
C# 中的委派演進
過去在 C# 1.0 中,建立委派之執行個體的步驟,是使用已定義於程式碼內其他位置的方法來明確初始化該委派。到了 C# 2.0,則引進以匿名方法來撰寫未命名內嵌陳述式區塊的概念,當時,該類區塊會透過委派引動過程來執行。C# 3.0 則引進 Lambda 運算式,這種運算式與匿名方法的概念相似,但其表示功能更為強大,而且也更簡潔。這兩種功能合稱為「匿名函式」(Anonymous Function)。一般而言,以 .NET Framework 3.5 版 (含) 以後版本做為目標的應用程式,都應該使用 Lambda 運算式。
下列範例會示範從 C# 1.0 到 C# 3.0 的委派建立演進過程:
class Test
{
delegate void TestDelegate(string s);
static void M(string s)
{
Console.WriteLine(s);
}
static void Main(string[] args)
{
// Original delegate syntax required
// initialization with a named method.
TestDelegate testdelA = new TestDelegate(M);
// C# 2.0: A delegate can be initialized with
// inline code, called an "anonymous method." This
// method takes a string as an input parameter.
TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); };
// C# 3.0. A delegate can be initialized with
// a lambda expression. The lambda also takes a string
// as an input parameter (x). The type of x is inferred by the compiler.
TestDelegate testDelC = (x) => { Console.WriteLine(x); };
// Invoke the delegates.
testdelA("Hello. My name is M and I write lines.");
testDelB("That's nothing. I'm anonymous and ");
testDelC("I'm a famous author.");
// Keep console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Hello. My name is M and I write lines.
That's nothing. I'm anonymous and
I'm a famous author.
Press any key to exit.
*/
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格中的下列章節:
- 5.3.3.29 匿名函式