委托與事件(二)

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

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

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

  • 委托的定義格式:
  • 修飾符 delegate 函數返回類型 委托名(函數參數)
    */
    namespace ConsoleApplication1
    {
    public delegate void DelegateDemo(); // 委托的定義(這是是沒有返回值的類型void , 也沒有參數)
    // 聲名一個委托,打招呼方式,用來管理下面好多種語言的打招呼方式
    public delegate void MakeGreeting(string name); // 聲名委托時候,要和傳進來的方法和返回值類型,參數列表都相同,否則報錯
    class Program
    {
    static void Main(string[] args)
    {
    // 關于委托的調用,我們還可以這樣:
    string s = "旺財", ss = "Tom";
    MakeGreeting mg1, mg2; // 聲名委托類型變量
    mg1 = ChineseGreeting;
    mg2 = EnglishGreeting;
    GreatingPeople(s , mg1); // 將委托類型變量做為參數傳入到方法
    GreatingPeople(ss, mg2);
    }
    // 下面是打招呼的幾個方法,平常,我們如果需要下面的幾個打招呼的時候,只需要調用函數名就好了。但是一般我們不這么用,太麻煩了。
    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);
    }
    // 聲名一個函數,用來管理上面幾個打招呼的方法。 將委托做為一個參數
    static void GreatingPeople(string name , MakeGreeting makegreeting )
    { // MakeGreeting Makegreeting 這委托能接收任何符合上面定義的委托的 void 類型的,參數為string類型的方法。
    makegreeting(name); // 在方法中調用傳進來的委托,相當于調用傳給委托的函數。
    }
    // 總結: 委托其實是一個數據類型(類),他明確了方法的返回值類型和參數,我們可以向一個委托當中以參數形式添加聲名相同,但功能不同的方法
    // 這樣在執行具體委托時,就可以同時執行已經添加到委托中的方法,并且添加什么方法就執行什么方法,只要類型和委托相同就可以。
    // 委托的出現,提高了代碼的靈活性,避免了大量的判斷或選擇語句,相當于動態的給方法賦值。
    }
    }

(4) 多播委托

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

  • 委托的定義格式:

  • 修飾符 delegate 函數返回類型 委托名(函數參數)
    */
    namespace ConsoleApplication1
    { // 委托還有一個強大的功能: 就是向同一個委托方法里,添加多個函數,并且同時調用。
    public delegate void Buy();
    class Program
    { // 多播委托,其實,就是委托里面可以有多個方法,同時被調用。
    static void Main(string[] args)
    {
    zhangSan zs = new zhangSan();
    // 在使用委托時,需要實例化委托,然后將方法添加到委托中,注意:添加的方法不能有小括號
    Buy buy = new Buy(zs.BuyFood);
    buy += zs.BuyWater; // 可以向同一個委托中添加多個方法,這時候,調用委托可以執行所有訪求,這時,這種情況就叫做 “多播委托”
    buy += zs.BuyTicket;
    buy();
    // 那么,上面,我們同時利用委托調用了好幾種方法,事實上,我們也可以減掉方法
    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

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

  • 委托的定義格式:

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

    }
    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 表達式,用于簡化匿名函數: 委托類型 委托名.(參數類型 參數) => {return x;}

  • 委托類型 委托名.參數 => {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>
    }

    }

}

《完》

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

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