欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#委托與匿名委托詳解

 更新時(shí)間:2017年08月31日 15:28:12   作者:DW039  
這篇文章主要為大家詳細(xì)介紹了C#委托與匿名委托的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本來(lái)是想寫(xiě)一篇《委托與lambda表達(dá)式的前世今生》,但僅委托部分已經(jīng)寫(xiě)了很多內(nèi)容,于是就此分開(kāi)關(guān)于Lambda表達(dá)是的內(nèi)容后續(xù)再寫(xiě)吧。

不知道Lambda表達(dá)式是誰(shuí)發(fā)明的,只記得第一次接觸Lambda表達(dá)式是在使用VS2008的時(shí)候,那就先認(rèn)為是微軟發(fā)明的吧。

Lambda表達(dá)式從我接觸開(kāi)始到現(xiàn)在變得越來(lái)越流行,Java8中開(kāi)始支持、kotlin更是對(duì)C#,F(xiàn)#做了廣泛的抄襲(C#曾幾何時(shí)不也如此對(duì)待過(guò)Java嘛)。其實(shí)這都充分說(shuō)明了,Lambda表達(dá)式的重要性。要搞清楚Lambda首先需要搞清楚委托。

委托:

假設(shè)現(xiàn)在我們要開(kāi)發(fā)一個(gè)處理兩個(gè)整數(shù)的程序(假設(shè)先處理相加操作)

public class Worker
    {
      /// <summary>
      /// 處理兩個(gè)數(shù)
      /// </summary>
      /// <param name="a"></param>
      /// <param name="b"></param>
      /// <returns></returns>
      public int HandleTwoNumber(int a,int b)
      {
        return a + b;
      }
    }
static void Main(string[] args)
    {
      int a = int.Parse(Console.ReadLine());
      int b = int.Parse(Console.ReadLine());

      Worker worker = new Worker();
      int result = worker.HandleTwoNumber(a, b);
      Console.WriteLine(String.Format("Result:{0}", result));

      string p = Console.ReadLine();
}

如果一段時(shí)間后,我們需要它變更為減操作:

public class Worker
    {
      public int HandleTwoNumber(int a,int b)
      {
        return a - b;
      }
    }

雖然有a+b變?yōu)閍-b的變化很微小,但后續(xù)此處可能面臨多次變化(由減變?yōu)槌?........)。有變化就應(yīng)封裝變化,此處我們可以將a與b的操作行為抽象出來(lái),用什么抽象呢?委托

public class Worker
    {
      public delegate int TwoNumberHandleMethodDelegate(int x, int y);
      public int HandleTwoNumber(int a,int b)
      {
        return a + b;
      }
    }

public delegate int TwoNumberHandleMethodDelegate(int x, int y);此處用delegate標(biāo)注,表明這是一個(gè)委托定義。如果去掉 delegate 再來(lái)觀察該定義,你會(huì)發(fā)現(xiàn)這就是一個(gè)沒(méi)有方法體的抽象方法。所以委托的含義即:與該抽象方法簽名形式相同的方法的類(lèi)型。委托就是一種你定義的新數(shù)據(jù)類(lèi)型,它與int、class是一樣的都是數(shù)據(jù)類(lèi)型。int表示整數(shù),只要是整數(shù)都可以賦值給 int型變量;TwoNumberHandleMethodDelegate則表示,接收兩個(gè)int型參數(shù)并返回int型結(jié)果的這類(lèi)方法,因此滿足上述要求的方法都可賦值給TwoNumberHandleMethodDelegate類(lèi)型的變量。

如此一來(lái)Worker代碼可修改為:

public class Worker
    {
      public delegate int TwoNumberHandleMethodDelegate(int x, int y);
      public int HandleTwoNumber(int a, int b, TwoNumberHandleMethodDelegate handle)
      {
        return handle(a, b);
      }
    }

如此a、b的操作被封裝起來(lái),所有的變化均交由調(diào)用者來(lái)處理。此處的含義:HandleTwoNumber處理a、b兩個(gè)整數(shù),具體如何處理由 handle 實(shí)施。此時(shí)你可能會(huì)問(wèn),那如何來(lái)調(diào)用該方法呢?調(diào)用如下:

private static int Add(int a, int b)
    {
      return a + b;
    }

    private static int Sub(int a, int b)
    {
      return a - b;
    }

    static void Main(string[] args)
    {
      int a = int.Parse(Console.ReadLine());
      int b = int.Parse(Console.ReadLine());
      Worker.TwoNumberHandleMethodDelegate method = new Worker.TwoNumberHandleMethodDelegate(Add);
      Worker worker = new Worker();
      int result = worker.HandleTwoNumber(10, 10,method);
       //int result = worker.HandleTwoNumber(10, 10, Sub);//簡(jiǎn)化版
      Console.WriteLine(String.Format("Result:{0}", result));
 }

根據(jù)上面的程序可知,Main代碼塊為worker的調(diào)用者,作為調(diào)用者而言應(yīng)該最清楚自己想要讓woker做的工作。因此作為被調(diào)用者的worker而言,它只需要接收調(diào)用者M(jìn)ain給的a\b參數(shù)及執(zhí)行Main定制的算法method,然后按照算法執(zhí)行并返回結(jié)果即可。上面代碼雖然簡(jiǎn)單,但其中的意義深遠(yuǎn),隨著編程時(shí)間的增加相信你的理解將越深刻。

委托變量在進(jìn)行賦值時(shí)除了標(biāo)準(zhǔn)的方式,還可以進(jìn)行簡(jiǎn)化:

Worker.TwoNumberHandleMethodDelegate method = new Worker.TwoNumberHandleMethodDelegate(Add);
      Worker worker = new Worker();
      int result = worker.HandleTwoNumber(10, 10,method);
//可簡(jiǎn)化為
// int result = worker.HandleTwoNumber(10, 10,Add);

編譯器將自動(dòng)檢查Add是否符合 TwoNumberHandleMethodDelegate 的定義,如果符合允許直接將方法名賦值給委托變量。

匿名委托

通過(guò)上面的示例代碼,我們很容易發(fā)現(xiàn) TwoNumberHandleMethodDelegate method 變量被賦值為Add(Sub),因此在調(diào)用method(...)時(shí)相當(dāng)于調(diào)用Add(.....)。這樣一來(lái)就可以認(rèn)為

method與Add完全等效,既然等效那是否可以直接將Add的定義內(nèi)容賦值給method變量呢?答案是肯定的:

static void Main(string[] args)
    {

      Worker.TwoNumberHandleMethodDelegate method =private static int Add(int a, int b)
    {
      return a + b;
    };
}

但像上面這種生拉硬套是不行的,你還需要做修改。修改內(nèi)容是:因?yàn)楝F(xiàn)在的代碼處于Main方法中,訪問(wèn)修飾符去掉,同樣static也應(yīng)去掉;同時(shí)編譯器知道你要給method賦值,那么要賦的這個(gè)值肯定滿足返回類(lèi)型為int的要求,所有int在此時(shí)就多余了去掉;因?yàn)橘x值之后method就等效于Add,以后調(diào)用只要通過(guò)method變量就可完成,所有Add方法名不需要去掉。如此代碼變?yōu)槿缦滦问剑?/p>

static void Main(string[] args)
    {

      Worker.TwoNumberHandleMethodDelegate method =  (int a, int b)
    {
      return a + b;
    };
}

經(jīng)過(guò)上面的修改內(nèi)容簡(jiǎn)化了很多,但method賦值的=右端是什么東西呢?此時(shí)編譯器并不能正確識(shí)別這是一個(gè)方法,因?yàn)榉椒ǖ亩x需要滿足包含:訪問(wèn)修身符、返回類(lèi)型、方法名、參數(shù)列表、方法體五部分內(nèi)容。雖然你心里清楚這是個(gè)簡(jiǎn)化了的方法,但是編譯器不懂你的心.........,那沒(méi)關(guān)系只要我們告訴編譯器,后面的是個(gè)簡(jiǎn)化方法就可以了。

static void Main(string[] args)
    {

      Worker.TwoNumberHandleMethodDelegate method =  delegate(int a, int b)
    {
      return a + b;
    };
}

正如你所期望的那樣,現(xiàn)在編譯器已經(jīng)知道了=右側(cè)是你經(jīng)過(guò)簡(jiǎn)化的方法;ok,現(xiàn)在可以正常賦值并使用了。

通過(guò)上面的定義我們發(fā)現(xiàn),用delegate標(biāo)注的簡(jiǎn)化方法沒(méi)有一個(gè)像Add/Sub一樣固定的名字。因此我們稱(chēng)這種方法叫匿名委托(我習(xí)慣稱(chēng)匿名方法)。

你可能還注意到該匿名委托定義完畢后就賦值給Main代碼快中的局部變量method,因此當(dāng)超出method的作用域后,該方法就再也沒(méi)有機(jī)會(huì)調(diào)用了。這引出了匿名方法、匿名委托、匿名函數(shù)它們的最常見(jiàn)用法,即用來(lái)定義只需要使用一次的功能代碼。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#微信公眾平臺(tái)開(kāi)發(fā)之a(chǎn)ccess_token的獲取存儲(chǔ)與更新

    C#微信公眾平臺(tái)開(kāi)發(fā)之a(chǎn)ccess_token的獲取存儲(chǔ)與更新

    這篇文章主要介紹了C#微信公眾平臺(tái)開(kāi)發(fā)之a(chǎn)ccess_token的獲取存儲(chǔ)與更新的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • C#中的委托delegate用法的示例詳解

    C#中的委托delegate用法的示例詳解

    這篇文章主要介紹了C#中的委托用法的示例詳解。本章將由淺入深地講述什么是委托、為什么要使用委托、事件的由來(lái)、.NET Framework 中的委托和事件、委托中方法異常和超時(shí)的處理、委托與異步編程、委托和事件對(duì)Observer 設(shè)計(jì)模式的意義。感興趣的可以了解一下
    2020-07-07
  • 輕松學(xué)習(xí)C#的讀寫(xiě)操作

    輕松學(xué)習(xí)C#的讀寫(xiě)操作

    輕松學(xué)習(xí)C#的讀寫(xiě)操作,小編也是第一次接觸C#的讀寫(xiě)操作,感興趣的小伙伴們可以參考一下,大家一起學(xué)習(xí)
    2015-11-11
  • 在WPF中實(shí)現(xiàn)平滑滾動(dòng)的方法詳解

    在WPF中實(shí)現(xiàn)平滑滾動(dòng)的方法詳解

    這篇文章介紹了WPF實(shí)現(xiàn)平滑滾動(dòng)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • c#值類(lèi)型和引用類(lèi)型使用示例

    c#值類(lèi)型和引用類(lèi)型使用示例

    這篇文章主要介紹了c#值類(lèi)型和引用類(lèi)型使用示例,需要的朋友可以參考下
    2014-04-04
  • c#索引器詳解示例

    c#索引器詳解示例

    索引器是一種特殊的類(lèi)成員,它能夠讓對(duì)象以類(lèi)似數(shù)組的方式來(lái)存取,使程序看起來(lái)更為直觀,更容易編寫(xiě)。
    2014-04-04
  • C#的WEBBROWSER與JS交互小結(jié)

    C#的WEBBROWSER與JS交互小結(jié)

    這篇文章主要介紹了C#的WEBBROWSER與JS交互方法,詳細(xì)講述了與頁(yè)面標(biāo)簽的交互以及數(shù)據(jù)交互的方法,需要的朋友可以參考下
    2014-11-11
  • c#實(shí)現(xiàn)漢諾塔問(wèn)題示例

    c#實(shí)現(xiàn)漢諾塔問(wèn)題示例

    這篇文章主要介紹了c#實(shí)現(xiàn)漢諾塔問(wèn)題示例,需要的朋友可以參考下
    2014-04-04
  • c#循環(huán)左移字符示例

    c#循環(huán)左移字符示例

    這篇文章主要介紹了c#循環(huán)左移字符示例,需要的朋友可以參考下
    2014-04-04
  • C#使用GDI+實(shí)現(xiàn)生成驗(yàn)證碼

    C#使用GDI+實(shí)現(xiàn)生成驗(yàn)證碼

    這篇文章介紹了C#使用GDI+實(shí)現(xiàn)生成驗(yàn)證碼的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論