委托與事件(二)

大家好,我是北京菜鳥在線的unity3d 高級講師,范老師,這次我們接著上次的內(nèi)容繼續(xù)

(3-1) 我們還可以用這樣的方法來求上述的題目:運行程序,我們發(fā)現(xiàn),兩種方法運行的結(jié)果一樣。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*
委托(delegate),用于封裝函數(shù)。

  • 委托的定義格式:
  • 修飾符 delegate 函數(shù)返回類型 委托名(函數(shù)參數(shù))
    */
    namespace ConsoleApplication1
    {
    public delegate void DelegateDemo(); // 委托的定義(這是是沒有返回值的類型void , 也沒有參數(shù))
    // 聲名一個委托,打招呼方式,用來管理下面好多種語言的打招呼方式
    public delegate void MakeGreeting(string name); // 聲名委托時候,要和傳進來的方法和返回值類型,參數(shù)列表都相同,否則報錯
    class Program
    {
    static void Main(string[] args)
    {
    // 關(guān)于委托的調(diào)用,我們還可以這樣:
    string s = "旺財", ss = "Tom";
    MakeGreeting mg1, mg2; // 聲名委托類型變量
    mg1 = ChineseGreeting;
    mg2 = EnglishGreeting;
    GreatingPeople(s , mg1); // 將委托類型變量做為參數(shù)傳入到方法
    GreatingPeople(ss, mg2);
    }
    // 下面是打招呼的幾個方法,平常,我們?nèi)绻枰旅娴膸讉€打招呼的時候,只需要調(diào)用函數(shù)名就好了。但是一般我們不這么用,太麻煩了。
    static void EnglishGreeting(string name) // 英文的打招呼方式
    {
    Console.WriteLine("Good Morning Baby !" + name);
    }
    static void ChineseGreeting(string name) // 中文的打招呼方式
    {
    Console.WriteLine("早上好,寶貝 !" + name);
    }
    static void HanYu(string name) // 韓文打招呼方式
    {
    Console.WriteLine("?? ??, ??" + name);
    }
    static void RiYu(string name) // 日文打招呼方式
    {
    Console.WriteLine("朝は赤ちゃんが良いです。" + name);
    }
    // 聲名一個函數(shù),用來管理上面幾個打招呼的方法。 將委托做為一個參數(shù)
    static void GreatingPeople(string name , MakeGreeting makegreeting )
    { // MakeGreeting Makegreeting 這委托能接收任何符合上面定義的委托的 void 類型的,參數(shù)為string類型的方法。
    makegreeting(name); // 在方法中調(diào)用傳進來的委托,相當于調(diào)用傳給委托的函數(shù)。
    }
    // 總結(jié): 委托其實是一個數(shù)據(jù)類型(類),他明確了方法的返回值類型和參數(shù),我們可以向一個委托當中以參數(shù)形式添加聲名相同,但功能不同的方法
    // 這樣在執(zhí)行具體委托時,就可以同時執(zhí)行已經(jīng)添加到委托中的方法,并且添加什么方法就執(zhí)行什么方法,只要類型和委托相同就可以。
    // 委托的出現(xiàn),提高了代碼的靈活性,避免了大量的判斷或選擇語句,相當于動態(tài)的給方法賦值。
    }
    }

(4) 多播委托

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*
委托(delegate),用于封裝函數(shù)。

  • 委托的定義格式:

  • 修飾符 delegate 函數(shù)返回類型 委托名(函數(shù)參數(shù))
    */
    namespace ConsoleApplication1
    { // 委托還有一個強大的功能: 就是向同一個委托方法里,添加多個函數(shù),并且同時調(diào)用。
    public delegate void Buy();
    class Program
    { // 多播委托,其實,就是委托里面可以有多個方法,同時被調(diào)用。
    static void Main(string[] args)
    {
    zhangSan zs = new zhangSan();
    // 在使用委托時,需要實例化委托,然后將方法添加到委托中,注意:添加的方法不能有小括號
    Buy buy = new Buy(zs.BuyFood);
    buy += zs.BuyWater; // 可以向同一個委托中添加多個方法,這時候,調(diào)用委托可以執(zhí)行所有訪求,這時,這種情況就叫做 “多播委托”
    buy += zs.BuyTicket;
    buy();
    // 那么,上面,我們同時利用委托調(diào)用了好幾種方法,事實上,我們也可以減掉方法
    Console.WriteLine("sssssssssssssssss");
    buy -= zs.BuyFood;
    buy -= zs.BuyTicket;
    buy(); // 只剩下買水這個方法
    // 委托與委托之間,也能通過符號進行添加
    Buy buy1 = new Buy(zs.BuyTicket); // 又向委托中添加了買電影票方法
    buy += buy1;
    buy(); // 那么這個時候,就打印了買水,和買電影票這兩個方法
    // 需要說明的是,如果你使用的是 buy()、這個,那么打印的將是 兩次買水,一次電影票
    }

    }
    class zhangSan
    {
    public void BuyFood()
    {
    Console.WriteLine("讓張三買吃的");
    }
    public void BuyWater()
    {
    Console.WriteLine("讓線三買水");
    }
    public void BuyTicket()
    {
    Console.WriteLine("讓張三賣電影票");
    }
    }
    }

(4-1) 委托的其它用法,如下圖,其中第3條不怎么用,所以我們就略過了。


image

匿名函數(shù)的委托;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*
委托(delegate),用于封裝函數(shù)。 委托一般不是自己用的,是給別人用的。如果自己用的話,一般不用委托

  • 委托的定義格式:

  • 修飾符 delegate 函數(shù)返回類型 委托名(函數(shù)參數(shù))
    */
    namespace ConsoleApplication1
    {
    public delegate void Buy();
    class Program
    { //
    static void Main(string[] args)
    {
    // Buy buy = new Buy(zs.BuyWater); // 實例化委托的時候,必須要至少添加一個方法,否則會報錯
    // buy();
    // 匿名函數(shù) :委托類型 委托名 = new 委托類型(delegate(參數(shù)類型 參數(shù)) {函數(shù)體});
    Buy buy = new Buy(delegate() { Console.WriteLine("汪汪汪"); });
    buy();// 這個時候,打印的就是直接是 “汪汪汪”;
    // 當然上述有些麻煩,我們還可以簡寫如下;
    Buy buy1 = delegate(){ Console.WriteLine("汪汪汪"); };
    buy1(); // 運行程序,我們發(fā)現(xiàn),打印了兩次 “汪汪汪”;這種方法和上面的方法運行結(jié)果一致。
    }

    }
    class zhangSan
    {

     public void BuyFood()
     {
         Console.WriteLine("讓張三買吃的");
     }
     public void BuyWater()
     {
         Console.WriteLine("讓線三買水");
     }
     public void BuyTicket()
     {
         Console.WriteLine("讓張三賣電影票");
     }
    

    }
    }
    (4-2) Lambda 表達式
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    /*
    Lambda 表達式,用于簡化匿名函數(shù): 委托類型 委托名.(參數(shù)類型 參數(shù)) => {return x;}

  • 委托類型 委托名.參數(shù) => {return x}; 簡寫的 Lambda表達式
    */
    namespace ConsoleApplication1
    {
    public delegate void Buy();
    public delegate string kaka(string str);
    class Program
    { //
    static void Main(string[] args)
    { // => : 這個符號叫做 gose to
    Buy buy = () => { Console.WriteLine("汪汪汪"); };
    buy(); // 運行程序,我們可以看到打印了 “汪汪汪”;
    kaka buy1 = (string s) => { return s; };
    Console.WriteLine( buy1("meimei")); // 運行程序,我們看到了,打印出了 “meimei”;
    // 委托也能使用泛型
    // delegate<T>
    }

    }

}

《完》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 大家好,我是北京菜鳥在線的unity3d高級講師范老師 直接上代碼 首先,我們需要知道的是,委托是一種類型,它可以...
    土豆_9724閱讀 346評論 0 0
  • 目錄本次給大家介紹的是我收集以及自己個人保存一些.NET面試題第二篇簡介1.接口2.您在什么情況下會用到虛方法或抽...
    寒劍飄零閱讀 2,034評論 0 10
  • 1. [C#語言基礎(chǔ)]請簡述拆箱和裝箱。 答: 裝箱操作: 值類型隱式轉(zhuǎn)換為object類型或由此值類型實現(xiàn)的任何...
    胤醚貔貅閱讀 4,978評論 1 28
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • 文/二璐 這世上唯有真心才能與幸福對等,別的,都不行。 1 你有沒有一瞬間突然就決定從某個人的生命中徹底撤離? 荔...
    二璐閱讀 786評論 0 24

友情鏈接更多精彩內(nèi)容