博文技術有限,重在學習交流,有錯誤大家指正。
思路:
傳統的方法調用------>委托的出現解決了什么問題---->委托的綁定方法----->總結
1.傳統的方法調用

class Program
{
static void Main(string[] args)
{
//如果某個人具有很多才藝
//某一個人要展示它的才藝,我們就必須將下面的方法跳舞,唱歌 追個調用,架設追個人博學多才,具有100個才藝呢,我們就必須多次調用方法
Dancing("Mr.w");
Singing("Mr.w");
}
static void Dancing(string name)
{
Console.WriteLine("{0}會跳舞",name);
}
static void Singing(string name)
{
Console.WriteLine("{0}會唱歌",name);
}
}
缺點:100個方法就要調用100次,如果每個人 對方法的需求不一樣,就不能很好的處理了。有人想展示跳舞,有人想唱歌,更有想一起展示。
2.引入 枚舉試試看

public enum CY
{
dance,sing
}
class Program
{
static void Main(string[] args)
{
//如果某個人具有很多才藝
//某一個人要展示它的才藝,我們就必須將下面的方法跳舞,唱歌 追個調用,架設追個人博學多才,具有100個才藝呢,我們就必須多次調用方法
Dancing("Mr.w");
Singing("Mr.w");
//並且對於每一個人的才藝不一樣的,可能需要增加才藝的方法,然后在Main函數內部再次調用,多么麻煩?
//思考:要是有一種東西,可以一次性把這些才藝方法都調用了,我們該多幸福啊。-。-
//好,以前好像學過枚舉,試試看。(把方法羅列)
PersonCY("Mr.w",CY.sing);
}
static void PersonCY(string name,CY one)
{
switch (one)
{
case CY.dance:
Dancing(name);
break;
case CY.sing:
Singing(name);
break;
default:
break;
}
}
static void Dancing(string name)
{
Console.WriteLine("{0}會跳舞",name);
}
static void Singing(string name)
{
Console.WriteLine("{0}會唱歌",name);
}
缺點:枚舉雖然可以解決根據枚舉的項判斷出 誰想展示什么才藝,但是擴展性不好。
思考:有沒有一種方法,參數內帶有:這個人的名字,然后自己想展示什么才藝,就自己帶入?
比如:方法(名字,我的才藝)
3.這個時候單播委托出現了
根據 方法(名字,我的才藝),這個類型知道:
名字是 string 類型的,也就是string類
我的才藝 是 方法,但是參數必須是有類型的,所以這里我們可以推斷出我們要設計 一個類CLASS,這個類就是所有方法的類型。
注:這里咱們輕易的看出了,委托起始就是定義 方法的類型。

public delegate void CYDL(string name);
class Program
{
static void Main(string[] args)
{
//委托就是給方法 定義類型
CYDL one =Dancing;
CYDL two =Singing;
CYDL[] cys = { one,two};
PersonCY("Mr.w",one);
PersonCY("Jack", two);
PersonCY("Herry", cys);
}
static void PersonCY(string name,params CYDL[] ones)
{
foreach (var n in ones)
{
n(name);
}
}
static void Dancing(string name)
{
Console.WriteLine("{0}會跳舞",name);
}
static void Singing(string name)
{
Console.WriteLine("{0}會唱歌",name);
}
}
輸出:
Mr.w會跳舞
Jack會唱歌
Herry會跳舞
Herry會唱歌
哈哈,問題解決了,它沒有利用switch語句,這樣就可以根據不同的人,選擇不同的才藝表演了。
有人可能以為這樣和寫傳統的方法調用 有什么區別,你注意到沒?你注意到沒:每次增加才藝,都必須在PersonCY()方法內修改,這樣使用委托帶入,即使
我們增加了才藝的方法,也只需要在委托中帶入即可。擴展性變優秀了。
注:上面還解決,一個人多個才藝的問題,但是做法不標准,一般我們是利用 多播委托來完成的。
4.多播委托

public delegate void CYDL(string name);
class Program
{
static void Main(string[] args)
{
CYDL one = new CYDL(Dancing);
one += new CYDL(Singing);
PersonCY("Mr.w",one);
}
static void PersonCY(string name,CYDL one)
{
one(name);
}
static void Dancing(string name)
{
Console.WriteLine("{0}會跳舞",name);
}
static void Singing(string name)
{
Console.WriteLine("{0}會唱歌",name);
}
}
思考:看起來還是不簡便,能否讓 PersonCY()也省略,直接讓委托調用方法,答案是可以的。
如下:

public delegate void CYDL(string name);
class Program
{
static void Main(string[] args)
{
CYDL one = new CYDL(Dancing);
one += new CYDL(Singing);
one("Mr.w");
}
static void Dancing(string name)
{
Console.WriteLine("{0}會跳舞",name);
}
static void Singing(string name)
{
Console.WriteLine("{0}會唱歌",name);
}
}
這樣是不是 簡便很多了?
注:這里有個多播委托的小細節,+=必須委托第二個方法的時候使用,第一委托必須是=,不然會出現未賦值的錯誤。
也可以使用-= 符號取消委托。
總結:博文技術有限,寫的有錯誤大家指正,從 為什么需要委托,認識到了 委托其實就是一個 定義方法類型的類,到 簡化代碼實現了委托綁定了方法。