C#3.0匿名方法的實現與應用

來源:互聯網
上載者:User

前面的文章中,大家已經對C#3.0的新特性有了一個基本的瞭解,比如強大的LINQ語言和擴充方法的應用,今天給大家介紹的是C#3.0中添加的另一個重要的新特性:匿名方法。

1. 匿名溯源

匿名的曆史可謂由來已久,在C#2.0中匿名方法就已經大量使用在委託(delegate)的應用情境中。下面我舉幾個例子大家可以簡單回顧一下:

1) 當我們需要調用一個回調方法時,不需要構建委派物件,只需要將回調方法名傳入,CLR會替我們完成委派物件的建立工作。

//example 1
public static void CallBackWithoutANewDelegateObject()
{
//這裡QueueUserWorkItem方法需要一個委託作為參數,
//但我們僅僅傳遞給回調方法名,CLR可以自動為我們構造出委派物件的代碼
ThreadPool.QueueUserWorkItem(SomeAsyncTask, 5);
}
private static void SomeAsyncTask(object o)
{
Console.WriteLine(o);
}

這個例子中我們沒有構造出任何委派物件,而僅僅傳遞了回調方法名稱,CLR幫我構建了建立委派物件的代碼。

2)我們甚至不用顯式定義回調方法,只需要使用delegate關鍵字內聯的寫出方法代碼執行調用。

//example 2
public static void CallbackWithoutNewingADelegateObject()
{
//我們在這兒以內聯形式寫出回調方法體,而沒有定義任何的回調方法
ThreadPool.QueueUserWorkItem(
delegate(object o) { Console.WriteLine(o); },
5);
}

這個例子中我們並沒有定義上面的方法SomeAsyncTask,而是內聯寫出方法體。

3)我們甚至可以不寫出調用方法的參數,CLR也會為我們產生正確的委派物件。

//example 3
this.BT_LOGIN.Click +=
delegate { MessageBox.Show("Button Login has been clicked!"); };

這是匿名方法最常見的使用情境,即在添加一個控制項的事件處理函數時直接使用delegate寫出方法代碼而不需要另外定義方法函數。當我們的事件處理函數很簡短時(比如上面的代碼我們僅僅彈出一個對話方塊顯示一條資訊而已。)我們就可以使用這種方法,如果另外定義一個函數就會顯得很累贅。而且方法的參數也可以省略(比如這裡的Object sender, EventArgs e)

2. C#3.0中的匿名方法

1) 隱式類型變數 (Implicitly typed local variables)

var var1 = 1;
var var2 = 2;
var var3 = var1 + var2;
var var4 = "I'm a string.";

這裡我們可以看到我們並沒有指定變數的類型(int , string, …),但編譯器會幫我們完成這一點。熟悉指令碼語言的朋友們可能會對此次文法感到驚喜,但要注意的是,C#仍然是強型別的語言,所有類型都會在編譯期確定,而不是像指令碼那樣等到運行時,下面這張圖很清楚的說明了這一點:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.