1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      C#委托、時間和Lambda表達(dá)式怎么理解

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

      成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供赫山企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)H5高端網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為赫山眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。

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

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

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

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

      以下是代碼片段:

      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實例可以接受兩個委托,調(diào)用all的時候,eo,er會被一次釣魚,返回值是***一個委托的返回值。程序的輸出是:

      Hello world

      Hello Delegat

      etageleD olleH

      -1

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

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

      以下是代碼片段:

      public delegate void EventHandler(   Object sender, EventArgs e )

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

      以下是代碼片段:

      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);   }   }   }

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

      以下是代碼片段:

      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!。如果需要在觸發(fā)事件的時候,傳遞更多的信息給事件處理函數(shù),比如當(dāng)前找到的奇數(shù)是多少,那么就需要新建一個類繼承自EventArgs,在這個類中可以添加一些需要的數(shù)據(jù)。 再聲明一個委托,第二個參數(shù)為EventArgs類型即可。

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

      以下是代碼片段:

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

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

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

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

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

      n=>n%2==0;

      等價于

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

      expression lambda 廣泛應(yīng)用于LINQ,它可以用來構(gòu)造Expression Tree,Expression Tree是LINQ的基礎(chǔ)。可以通過動態(tài)構(gòu)造Expression Tree來實現(xiàn)復(fù)雜的動態(tài)LINQ查詢,不過這種方法雖然通用,對于數(shù)據(jù)庫查詢,使用起來和傳統(tǒng)的拼接字符串相比還是很麻煩。

      到此,關(guān)于“C#委托、時間和Lambda表達(dá)式怎么理解”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
      本文標(biāo)題:C#委托、時間和Lambda表達(dá)式怎么理解
      URL鏈接:http://www.ef60e0e.cn/article/piegds.html

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        大港区| 禄丰县| 修武县| 台前县| 汤阴县| 山阴县| 浦县| 增城市| 紫阳县| 宿迁市| 利津县| 定安县| 枣阳市| 汶上县| 平湖市| 二连浩特市| 乌拉特前旗| 穆棱市| 策勒县| 定南县| 日喀则市| 赣州市| 高密市| 平昌县| 白朗县| 武邑县| 柏乡县| 赞皇县| 凤城市| 柳江县| 南漳县| 永宁县| 九寨沟县| 安岳县| 彩票| 辰溪县| 会同县| 五指山市| 兴海县| 日照市| 安塞县|