C#中的委托、事件以及lambda表達式是經常讓我頭暈的內容,今天簡單總結一下,內容來自《C#入門經典》13、14章。
委托(delegate)就是一種可以把引用存儲為函數的類型,實際上非常簡單。首先定義一個委托,然後就可以聲明委托類型的變量,然後可以把該變量初始化為與委托具有相同返回類型和參數列表的函數的引用。之後就可以使用委托變量調用函數,就像該變量是一個函數一樣。
匿名方法(anonymous method):並非傳統意義上的方法,而是純粹作為委托目的而創建的。格式如下:
delegate(parameters){//anonymous method code}
事件(event):事件類似於異常,因為他們都是由對象引發(拋出),但是區別是不是使用try--catch類似的結構來處理事件,而是必須訂閱(subscribe)他們,訂閱一個事件的含義是提供在事件發生時執行的代碼,他們被稱為事件處理程序。對事件處理程序的要求是必須匹配事件所要求的返回類型和參數,這些限制是事件定義的一部分,由一個委托指定。
處理過程如下:應用程序創建一個可以引發事件的對象,然後應用程序訂閱該事件,然後事件發生後,通知事件處理程序。
View Code其中,MessageHandler委托中包含了事件處理程序中常見的兩種參數:(object source, MessageArrivedEventArgs e);分別是:引發事件的對象的引用,以及由事件傳送的參數。
由於委托用起來比較麻煩,需要先定義委托,聲明委托變量,然後把該變量初始化為與委托具有相同返回類型和參數列表的函數的引用,然後使用委托變量調用函數,所以微軟就定義了一個簡單方法,就是Action<T>委托和Func<T>委托,分別代表有/無返還值的情況,用法如下:
View Code這裡面的三種寫法,效果是相同的。
lambda表達式
我理解:lambda表達式本質上就是一個委托,用於簡化C#編程的某些方面,由3部分組成:放在括號中的參數列表;=>運算符;C#語句。編譯器會提取這個lambda表達式,創建一個匿名方法。
如以下語句的效果同上面三種寫法。
Action<String> newprint = (s) => { Console.WriteLine("{0}", s); };
注意有些函數就是用Action<T>委托和Func<T>委托作為參數的,使用起來非常方便,如在List中查找第一個名為"Jim"的人:
View Code這種語法糖實在讓人費解,和糾結於“茴字的四樣寫法”差不多,不過熟悉後可以寫出比較簡潔漂亮的代碼,還是不錯的。