摘至msdn
在 2.0 之前的 C# 版本中,聲明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法。
要將代碼塊傳遞為委托參數,創建匿名方法則是唯一的方法。例如:
// Create a handler for a click event
button1.Click += delegate(System.Object o, System.EventArgs e)
...{ System.Windows.Forms.MessageBox.Show("Click!"); };
或
// Create a delegate instance
delegate void Del(int x);
// Instantiate the delegate using an anonymous method
Del d = delegate(int k) ...{ /**//* ... */ };
如果使用匿名方法,則不必創建單獨的方法,因此減少了實例化委托所需的編碼系統開銷。
例如,如果創建方法所需的系統開銷是不必要的,在委托的位置指定代碼塊就非常有用。啟動新線程即是一個很好的示例。無需為委托創建更多方法,線程類即可創建一個線程並且包含該線程執行的代碼。
void StartThread()
...{
System.Threading.Thread t1 = new System.Threading.Thread
(delegate()
...{
System.Console.Write("Hello, ");
System.Console.WriteLine("World!");
t1.Start();
}
匿名方法的參數的范圍是 anonymous-method-block。
在目標在塊外部的匿名方法塊內使用跳轉語句(如 goto、break 或 continue)是錯誤的。在目標在塊內部的匿名方法塊外部使用跳轉語句(如 goto、break 或 continue)也是錯誤的。
如果局部變量和參數的范圍包含匿名方法聲明,則該局部變量和參數稱為該匿名方法的外部變量或捕獲變量。例如,下面代碼段中的 n 即是一個外部變量:
int n = 0;
Del d = delegate() ...{ System.Console.WriteLine("Copy #:{0}", ++n); };
與局部變量不同,外部變量的生命周期一直持續到引用該匿名方法的委托符合垃圾回收的條件為止。對 n 的引用是在創建該委托時捕獲的。
匿名方法不能訪問外部范圍的 ref 或 out 參數。
在 anonymous-method-block 中不能訪問任何不安全代碼。