大家好,我是北京菜鳥在線的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條不怎么用,所以我們就略過了。
匿名函數的委托;
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>
}}
}
《完》