C# 編程指南
匿名方法(C# 編程指南) 在 2.0 之前的 C# 版本中,聲明委託的唯一方法是使用命名方法。C# 2.0 引入了匿名方法。要將代碼塊傳遞為委託參數,建立匿名方法則是唯一的方法。例如:C#複製代碼// Create a handler for a click eventbutton1.Click += delegate(System.Object o, System.EventArgs e) { System.Windows.Forms.MessageBox.Show("Click!"); };或C#複製代碼// Create a delegate instancedelegate void Del(int x); // Instantiate the delegate using an anonymous methodDel d = delegate(int k) { /* ... */ };如果使用匿名方法,則不必建立單獨的方法,因此減少了執行個體化委託所需的編碼系統開銷。例如,如果建立方法所需的系統開銷是不必要的,在委託的位置指定代碼塊就非常有用。啟動新線程即是一個很好的樣本。無需為委託建立更多方法,線程類即可建立一個線程並且包含該線程執行的代碼。C#複製代碼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 即是一個外部變數:C#複製代碼int n = 0;Del d = delegate() { System.Console.WriteLine("Copy #:{0}", ++n); };與局部變數不同,外部變數的生命週期一直持續到引用該匿名方法的委託符合記憶體回收的條件為止。對 n 的引用是在建立該委託時捕獲的。匿名方法不能訪問外部範圍的 ref 或 out 參數。在
anonymous-method-block 中不能訪問任何不安全的程式碼。 樣本 下面的樣本示範執行個體化委託的兩種方法:使委託與匿名方法關聯。使委託與命名方法 (DoWork) 關聯。兩種方法都會在調用委託時顯示一條訊息。C#複製代碼// Declare a delegatedelegate void Printer(string s); class TestClass{ staticvoid Main() { // Instatiate the delegate type using an anonymous method: Printer p = delegate(string j) { System.Console.WriteLine(j); }; // Results from the anonymous delegate call: p("The delegate using the anonymous method is called."); // The delegate instantiation using a named method "DoWork": p = new Printer(TestClass.DoWork); // Results from the old style delegate call: p("The delegate using the named method is called."); } // The method associated with the named delegate: staticvoid DoWork(string k) { System.Console.WriteLine(k); }} 輸出 The delegate using the anonymous method is called. The delegate using the named method is called. (來源:msdn )