久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

詳解C#委托,、時(shí)間和Lambda表達(dá)式 - 51CTO.COM

 sirianyan 2010-09-14

關(guān)于這個(gè)論題,

Delegates, Events, and Lambda Expressions 對(duì)此有比較深入的分析,,可以參考,。

C# vs C++之一:委托 vs 函數(shù)指針 比較了委托和C++指針的區(qū)別。

.NET 中的委托確實(shí)和C/C++的函數(shù)指針?lè)浅O嗨?。它是一個(gè)值類型,,它包裝了一個(gè)指向方法的引用。它的作用也是為了能夠?qū)⒎椒ê妥兞恳粯幼鳛閰?shù)傳遞,。委托的典型應(yīng)用是控件的事件處理方法,。很顯然,一個(gè)控件在設(shè)計(jì)的時(shí)候沒(méi)有辦法知道當(dāng)特定事件發(fā)生的時(shí)候,,需要什么方法來(lái)處理,,這就需要將方法作為參數(shù)傳遞給控件。在LINQ中,,也大量用到了委托,。

聲明一個(gè)委托要使用delegate關(guān)鍵字,如下:

delegate int Echo(string message);這句代碼聲明了一個(gè)委托類型,,這個(gè)委托類型的實(shí)例可以接受參數(shù)為string,,返回值為int型的函數(shù)。這個(gè)方法可以是對(duì)象的方法,,也可以靜態(tài)方法,,還可以是匿名方法,只要方法的簽名和返回值是和聲明一致的。這和C的函數(shù)指針很像,,但是函數(shù)指針僅僅包含函數(shù)入口地址,,而委托是一個(gè)類型,它具有比函數(shù)指針更強(qiáng)的功能,。其中一點(diǎn)就是當(dāng)方法是實(shí)例方法的時(shí)候,,這個(gè)方法可以獲得對(duì)象的其他變量的值,文首的第二篇文章對(duì)此有詳細(xì)介紹,,不再贅述,。第二點(diǎn)就是委托是支持多播的,也就是一串方法可以可以依次被執(zhí)行,。例如:

  1. static int EchoOriginal(string message)  
  2. {  
  3.     Console.WriteLine(message);  
  4.     return 1;  
  5. }  
  6.  
  7. static int EchoReverse(string message)  
  8. {  
  9.     StringBuilder sb=new StringBuilder();  
  10.     for(int i=message.Length-1;i>=0;i--)               
  11.         sb.Append(message[i]);               
  12.     Console.WriteLine(sb.ToString());  
  13.     return -1;  
  14. }         
  15.  
  16. static void Main(string[] args)  
  17. {  
  18.     Echo eo = EchoOriginal;  
  19.     Echo er = EchoReverse;  
  20.     Echo all = eo + er;  
  21.     eo("Hello world");  
  22.     int i=all("Hello Delegate");  
  23.     Console.WriteLine(i);  

我們定義兩個(gè)方法,這兩個(gè)方法都符合Echo的聲明,,最后Echo的all實(shí)例可以接受兩個(gè)委托,,調(diào)用all的時(shí)候,eo,,er會(huì)被一次釣魚,,返回值是最后一個(gè)委托的返回值。程序的輸出是:

  1. Hello world   
  2. Hello Delegate   
  3. etageleD olleH   
  4. -1 

事實(shí)上,,方法并不需要和委托聲明類型的簽名完全一致,,.net允許方法的返回值是繼承自聲明的返回值的類型,方法的參數(shù)類型是聲明的參數(shù)的父類型,。這就是Covariance and Contravariance in Delegates.

.NET的事件機(jī)制是以委托為基礎(chǔ)的,。事件機(jī)制有兩部分組成,一部分是事件發(fā)布者,,一部分是事件響應(yīng)者,。其實(shí)現(xiàn)原理就是由事件發(fā)布者聲明一個(gè)委托對(duì)象,由事件響應(yīng)者向那個(gè)委托掛載具體的處理方法,,事件發(fā)布者在需要的時(shí)候調(diào)用這個(gè)委托,,這樣響應(yīng)者的代碼就會(huì)被執(zhí)行。事實(shí)上,,.NET也是這么做的,。C#的event關(guān)鍵字就僅僅做了少量的工作,其中包括為類生成一個(gè)私有的delegate. event所支持的委托是有限制的委托,,它的返回值必須是void,參數(shù)是兩個(gè),,第一個(gè)是事件發(fā)生者,第二個(gè)參數(shù)是事件需要攜帶的參數(shù),。最簡(jiǎn)單的事件處理委托.net已經(jīng)聲明了:

  1. public delegate void EventHandler(  
  2.    Object sender,    EventArgs e ) 

聲明事件的基本方式是 event 委托類型 事件名稱;舉個(gè)例子,,有這樣的類,每當(dāng)找到一個(gè)奇數(shù),,他就會(huì)觸發(fā)一個(gè)事件,。我們的程序在接到這個(gè)事件的時(shí)候在屏幕輸出一個(gè)提示,。類的代碼可以這樣實(shí)現(xiàn):

  1. public class OddFinder  
  2.    {  
  3.        public event EventHandler FindOdd;  
  4.  
  5.        public void Find(int from, int to)  
  6.        {  
  7.            for (int i = from; i <= to; i++)  
  8.            {  
  9.                if (i % 2 != 0)  
  10.                    if (FindOdd != null)  
  11.            FindOdd(this, EventArgs.Empty);  
  12.            }  
  13.        }  
  14.    } 

這個(gè)類很簡(jiǎn)單,展示了發(fā)起事件的基本方法,。首先聲明一個(gè)事件,,指明這個(gè)事件處理函數(shù)的委托類型。在需要觸發(fā)事件的時(shí)候,,首先判斷是否有事件處理函數(shù)掛載,,然后調(diào)用這個(gè)委托即可。外部處理程序把事件處理程序掛載上去:

  1. static void Main(string[] args)  
  2. {  
  3.      OddFinder f = new OddFinder();  
  4.      f.FindOdd += new EventHandler(f_FindOdd);  
  5.      f.Find(1, 5);  
  6. }  
  7.  
  8. static void f_FindOdd(object sender, EventArgs e)  
  9. {  
  10.     Console.WriteLine("Found!");  

這樣程序運(yùn)行后,,就會(huì)在屏幕上輸出3次Found,!。如果需要在觸發(fā)事件的時(shí)候,,傳遞更多的信息給事件處理函數(shù),,比如當(dāng)前找到的奇數(shù)是多少,那么就需要新建一個(gè)類繼承自EventArgs,在這個(gè)類中可以添加一些需要的數(shù)據(jù),。 再聲明一個(gè)委托,,第二個(gè)參數(shù)為EventArgs類型即可。

以上是基本的委托和事件的介紹,,自.net 1.0開始就是如此,,.net 2.0 引入了匿名方法,可以簡(jiǎn)化委托的某些操作,。例如:

  1. f.FindOdd += delegate(object sender, EventArgs e)  
  2. {  
  3.     Console.WriteLine("Found!");  
  4. }; 

匿名方法使用delegate關(guān)鍵字加上參數(shù)表,,最后是代碼塊來(lái)定義。它可以作為委托賦值給委托類型,。它可以省去單獨(dú)定義一個(gè)方法的麻煩,。

.NET 3.0之后引入了Lambda表達(dá)式,它進(jìn)一步簡(jiǎn)化了匿名方法的寫法,,使得在C#中,,把函數(shù)作為參數(shù)傳遞變得更加簡(jiǎn)單自然,從而C#變得更加具有函數(shù)式語(yǔ)言的味道,。關(guān)于函數(shù)式語(yǔ)言的進(jìn)一步介紹,,可以參考:Functional Programming Languages . 函數(shù)式語(yǔ)言的理論基礎(chǔ)是Lambda Calulus,關(guān)于此可以參考A Tutorial Introduction to the Lambda Calculus .

Lambda表達(dá)式本質(zhì)上還是匿名方法,,它的一般形式是:

(input parameters) => expression左側(cè)是參數(shù)列表,,=>右側(cè)是方法體,可以是一個(gè)表達(dá)式(expression lambda),,也可以是大括號(hào)括起來(lái)的語(yǔ)句段(statement lambda),。它省略了delegate關(guān)鍵字,使得代碼更加緊湊。例如:

n=>n%2==0;

等價(jià)于

delegate(int n){ return n%2==0;}

expression lambda 廣泛應(yīng)用于LINQ,,它可以用來(lái)構(gòu)造Expression Tree,Expression Tree是LINQ的基礎(chǔ),。可以通過(guò)動(dòng)態(tài)構(gòu)造Expression Tree來(lái)實(shí)現(xiàn)復(fù)雜的動(dòng)態(tài)LINQ查詢,,不過(guò)這種方法雖然通用,,對(duì)于數(shù)據(jù)庫(kù)查詢,使用起來(lái)和傳統(tǒng)的拼接字符串相比還是很麻煩,。下文將介紹微軟的一個(gè)LINQ擴(kuò)展,,Dynamic LINQ.

原文標(biāo)題:C# 委托,事件和Lambda表達(dá)式

鏈接:http://www.cnblogs.com/yinzixin/archive/2010/09/14/1825611.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多