C#匿名方法的用法
??? 先看看MSDN對匿名方法的描述。
??? 在2.0 之前的 C# 版本中,聲明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表達式取代了匿名方法,作為編寫內聯代碼的首選方式。不過,本主題中有關匿名方法的信息同樣也適用于 Lambda 表達式。有一種情況下,匿名方法提供了 Lambda 表達式中所沒有的功能。匿名方法使您能夠省略參數列表,這意味著可以將匿名方法轉換為帶有各種簽名的委托。
??? 匿名方法不是一個事先定義的方法,而是使用一個委托的代碼塊,在使用時,這和普通方法沒有區別,但是匿名方法可以在一定程度上減少系統開銷。
如何使用匿名方法?
下面舉例說明如何利用匿名方法以及匿名方法的優點:
首先大家新建一個窗體工程,面板上放按鈕,就用按鈕的事件里面來看看匿名方法的使用吧。
?
1、常見用法
使用匿名方法很簡單。只需要把匿名方法放在你通常放命名方法的關聯語句里。下面例1里用委托執行了一個匿名方法:
示例1
private delegate void Example1Delegate(); private void button1_Click(object sender, EventArgs e) { Example1Delegate example = new Example1Delegate(delegate() { string showString = "例1:匿名方法基本用法。"; MessageBox.Show(showString); }); example(); }結果圖:
?2、變量范圍
任何在匿名方法里聲明的變量的范圍都不會超出匿名方法的代碼塊。但是,匿名方法具有訪問它代碼塊之外的變量的能力,只要這些變量在匿名方法所使用的范圍里。這些變量稱為外部變量。下面示例2顯示了匿名方法如何引用外部變量:
示例2?
private delegate void Example2Delegate(); private void button2_Click(object sender, EventArgs e) { string stringFirst = "例2:"; string stringLast = "匿名方法使用外部變量。"; Example2Delegate example = new Example2Delegate( delegate() { string showString = string.Format("{0} {1}", stringFirst, stringLast); MessageBox.Show(showString); }); example(); }?結果圖:
要注意的是,根據MSDN的文檔,匿名方法里的ref和out參數無法被訪問到。
?3、參數的傳遞
可以將參數傳遞給匿名方法,方式就和處理引用命名方法參數的委托一樣。下面的示例3說明這種類型的功能:
示例3
private delegate void Example3Delegate(string parameter1, string parameter2); private void button3_Click(object sender, EventArgs e) { string parameterString1 = "例3:"; string parameterString2 = "匿名方法參數傳遞。"; Example3Delegate example = new Example3Delegate( delegate(string string1, string string2) { string showString = string.Format("{0} {1}", string1, string2); MessageBox.Show(showString); }); example(parameterString1, parameterString2); }結果圖:
?4、多個方法的關聯
就和命名方法一樣,將多個匿名方法與同一個委托進行關聯是可能的。這在很多情況下會非常有用——首先想到的是把一個簡單的處理程序添加給按鈕的點擊事件。下面的代碼顯示了一個委托,它同時帶有與之相關聯一個匿名方法和一個命名方法:
示例4
private delegate void Example4Delegate(string parameter1, string parameter2); private void button4_Click(object sender, EventArgs e) { string parameterString1 = "例4:"; string parameterString2 = "多個方法的關聯。"; Example4Delegate example = new Example4Delegate( delegate(string string1, string string2) { string showString = string.Format("{0} {1}(匿名方法)", string1, string2); MessageBox.Show(showString); }); example += new Example4Delegate(Example4NamedMethod); example(parameterString1, parameterString2); } private void Example4NamedMethod(string parameter1, string parameter2) { string showString = string.Format("{0} {1}(命名方法)", parameter1, parameter2); MessageBox.Show(showString); }結果圖:
?
5、將匿名方法作為參數傳遞
?就和命名方法一樣,將匿名方法作為參數傳遞給函數是可能的。下面的代碼說明了這種類型的功能,它將一個命名方法作為參數傳遞給了函數:
示例5
private delegate void Example5Delegate(string parameter1, string parameter2); private void button5_Click(object sender, EventArgs e) { Passit((Example5Delegate) delegate(string parameter1, string parameter2) { string showString = string.Format("{0} {1}(匿名方法)", parameter1, parameter2); MessageBox.Show(showString); }); Passit(Example5NamedMethod); } private void Example5NamedMethod(string parameter1, string parameter2) { string showString = string.Format("{0} {1}(命名方法)", parameter1, parameter2); MessageBox.Show(showString); } private void Passit(Example5Delegate example) { example("例5:", "匿名方法作為參數傳遞。"); }結果圖:
?6、訪問類成員
這是對上面例2的變量范圍的擴展。
示例6
private delegate void Example6Delegate(); private string testString1; private string testString2; public string TestString1 { get { return testString1; } set { testString1 = value; } } public string TestString2 { get { return testString2; } set { testString2 = value; } } private void button6_Click(object sender, EventArgs e) { this.TestString1 = "例6:"; this.TestString2 = "訪問類成員"; Example6Delegate example = new Example6Delegate( delegate { this.ShowCustomer(this.TestString1, this.TestString2); }); example(); this.TestString1 = "Example6:"; this.TestString2 = "Visitor Class Member."; example(); } private void ShowCustomer(string parameter1, string parameter2) { string showString = string.Format("{0} {1}", parameter1, parameter2); MessageBox.Show(showString); }結果圖:
?
要注意的是,這里兩次調用了與匿名方法相關聯的委托。你可能會發現一個很有趣的事情:在這些調用中,方法會輸出兩組不同的值。這是因為用在匿名方法里的外部變量在創建匿名方法的時候被引用。這意味著對這些變量的任何更改都會在匿名函數訪問變量的時候被反映出來。
總結
本文已經說明如何使用匿名方法。給初學者理解和使用匿名方法提供一個引導的作用。
總結
- 上一篇: Administrator用户被禁用
- 下一篇: C#学习笔记(二)运算符 乘方 判断语句