91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#委托、時間和Lambda表達式怎么理解

發布時間:2021-12-03 10:25:31 來源:億速云 閱讀:170 作者:iii 欄目:編程語言

這篇文章主要介紹“C#委托、時間和Lambda表達式怎么理解”,在日常操作中,相信很多人在C#委托、時間和Lambda表達式怎么理解問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#委托、時間和Lambda表達式怎么理解”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

.NET 中的委托確實和C/C++的函數指針非常相似。它是一個值類型,它包裝了一個指向方法的引用。它的作用也是為了能夠將方法和變量一樣作為參數傳遞。委托的典型應用是控件的事件處理方法。很顯然,一個控件在設計的時候沒有辦法知道當特定事件發生的時候,需要什么方法來處理,這就需要將方法作為參數傳遞給控件。在LINQ中,也大量用到了委托。

聲明一個委托要使用delegate關鍵字,如下:

delegate int Echo(string message);這句代碼聲明了一個委托類型,這個委托類型的實例可以接受參數為string,返回值為int型的函數。這個方法可以是對象的方法,也可以靜態方法,還可以是匿名方法,只要方法的簽名和返回值是和聲明一致的。這和C的函數指針很像,但是函數指針僅僅包含函數入口地址,而委托是一個類型,它具有比函數指針更強的功能。

其中一點就是當方法是實例方法的時候,這個方法可以獲得對象的其他變量的值,文首的第二篇文章對此有詳細介紹,不再贅述。第二點就是委托是支持多播的,也就是一串方法可以可以依次被執行。例如:

以下是代碼片段:

static int EchoOriginal(string message)   { Console.WriteLine(message);   return 1; }   static int EchoReverse(string message)   {   StringBuilder sb=new StringBuilder();   for(int i=message.Length-1;i>=0;i--)   sb.Append(message[i]);   Console.WriteLine(sb.ToString());   return -1; }   static void Main(string[] args)   {   Echo eo = EchoOriginal;   Echo er = EchoReverse;   Echo all = eo + er;   eo("Hello world");   int i=all("Hello Delegate");   Console.WriteLine(i);   }

我們定義兩個方法,這兩個方法都符合Echo的聲明,***Echo的all實例可以接受兩個委托,調用all的時候,eo,er會被一次釣魚,返回值是***一個委托的返回值。程序的輸出是:

Hello world

Hello Delegat

etageleD olleH

-1

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

.NET的事件機制是以委托為基礎的。事件機制有兩部分組成,一部分是事件發布者,一部分是事件響應者。其實現原理就是由事件發布者聲明一個委托對象,由事件響應者向那個委托掛載具體的處理方法,事件發布者在需要的時候調用這個委托,這樣響應者的代碼就會被執行。事實上,.NET也是這么做的。C#的event關鍵字就僅僅做了少量的工作,其中包括為類生成一個私有的delegate. event所支持的委托是有限制的委托,它的返回值必須是void,參數是兩個,***個是事件發生者,第二個參數是事件需要攜帶的參數。最簡單的事件處理委托.net已經聲明了:

以下是代碼片段:

public delegate void EventHandler(   Object sender, EventArgs e )

聲明事件的基本方式是 event 委托類型 事件名稱;舉個例子,有這樣的類,每當找到一個奇數,他就會觸發一個事件。我們的程序在接到這個事件的時候在屏幕輸出一個提示。類的代碼可以這樣實現:

以下是代碼片段:

public class OddFinder {   public event EventHandler FindOdd;   public void Find(int from, int to)   {   for (int i = from; i <= to; i++)   {   if (i % 2 != 0) if (FindOdd != null)   FindOdd(this, EventArgs.Empty);   }   }   }

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

以下是代碼片段:

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

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

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

以下是代碼片段:

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

匿名方法使用delegate關鍵字加上參數表,***是代碼塊來定義。它可以作為委托賦值給委托類型。它可以省去單獨定義一個方法的麻煩。

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

Lambda表達式本質上還是匿名方法,它的一般形式是:

(input parameters) => expression左側是參數列表,=>右側是方法體,可以是一個表達式(expression lambda),也可以是大括號括起來的語句段(statement lambda)。它省略了delegate關鍵字,使得代碼更加緊湊。例如:

n=>n%2==0;

等價于

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

expression lambda 廣泛應用于LINQ,它可以用來構造Expression Tree,Expression Tree是LINQ的基礎。可以通過動態構造Expression Tree來實現復雜的動態LINQ查詢,不過這種方法雖然通用,對于數據庫查詢,使用起來和傳統的拼接字符串相比還是很麻煩。

到此,關于“C#委托、時間和Lambda表達式怎么理解”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定陶县| 保山市| 灵武市| 南城县| 南阳市| 孙吴县| 江孜县| 綦江县| 吉林市| 定西市| 阜阳市| 四会市| 浮山县| 渝中区| 扶绥县| 横山县| 新巴尔虎右旗| 珲春市| 西畴县| 化德县| 宁海县| 盐亭县| 黔西县| 锦屏县| 集安市| 星座| 贡觉县| 青海省| 雷州市| 东海县| 安国市| 浪卡子县| 岐山县| 中方县| 晋城| 万山特区| 武平县| 千阳县| 灯塔市| 屯门区| 祁门县|