委託-.NET

委託

委託-.NET


關於委託,我來來回回學了四五次,每一次都有不同的感悟,但在此之前都是朦朦朧朧,諸如:委託就是委託別人去辦事情。

直到最近,偶然之下,突然恍然大悟一般,有了一些深入理解,以下,便是我的理解。

委託與集合變量

是的,我將C#中的委託比作了諸如list這種的集合變量,可以往變量里加數據(委託是加方法),並進行對應的附加操作。

帶著這種思路,我們來學習C#中的委託,首先是語法:

#聲明委託,下面是語法
delegate <return> <delegate-name> <parameter>
#關鍵字:delegate,其他部分都是自定義的。
# <return>:一個方法的返回值類型
#<delegate-name>:一個方法的名稱
#<parameter>:一個方法的參數列表
/<parameter>/<delegate-name>/<return>/<parameter>/<delegate-name>/<return>

從語法格式裡可以看出,委託定義的是一個方法的返回值、名稱、參數。

和定義類一樣,是一個自定義式的類型,而方法名就相當於類名,可以使用方法名去再次聲明一個自定義的類型容器,如:

public delegate int MyDelegate (string s);

到此,相當於我定義了一個MyDelegate類型,和類一樣,我通過new關鍵字去聲明

public static int AddNum(string num)
{
return num;
}
MyDelegate ps = new MyDelegate(AddNum);

和聲明類是同一個格式,只不過參數是必須的,且這個參數很特殊:是一個方法的名稱,且該方法是固定格式的,該方法的返回值和參數列表必須和聲明委託時的一樣。

換言之,ps就像一個集合變量,該集合變量可以存儲數據,特殊的是,這個數據是一個【方法】,並且【方法】的返回值和參數列表必須和聲明委託時是一致的。

所以,現在,我們的腦袋裡建立一個對委託的印象:

  • 委託是一個集合變量,可以往這個集合裡+增加數據,而數據是一個個方法,委託就像一個方法的容器。

  • 委託的使用流程:1.聲明(使用delegate)。2.使用new關鍵字創建一個委託容器。這個使用,該委託容器裡是有一個方法的了,怎麼加多個方法進去呢?用+=,也稱為委託的多播
delegate int NumberChanger(int n);
namespace DelegateAppl
{
class TestDelegate
{
static int num = 10;
public static int AddNum(int p)
{
num += p;
return num;
}

public static int MultNum(int q)
{
num *= q;
return num;
}
public static int getNum()
{
return num;
}

static void Main(string[] args)
{
// 創建委託實例
NumberChanger nc;
NumberChanger nc1 = new NumberChanger(AddNum);
NumberChanger nc2 = new NumberChanger(MultNum);
nc = nc1;
nc += nc2;
// 調用多播
nc(5);
Console.WriteLine("Value of Num: {0}", getNum());
Console.ReadKey();
}

}
}
  • 當上面的代碼被編譯和執行時,它會產生下列結果:
Value of Num: 75
  • 可以看到,nc這個委託裡先後合併了兩個委託:nc1與nc2,所以,在調用nc(5)的時候,會按照順序,先後調用了AddNum(5)、MultNum(5).

委託與變量

其實我現在就把委託當作一種特殊的集合變量,它可以存儲方法(特定參數和特定返回值的方法),存儲起來之後,我可以將該變量傳遞到各個方法裡(因為變量可以隨意傳遞),於是,我們翻轉一下,我聲明瞭一個委託,如下:

public delegate void helpme(int s);

然後在我定義的一個類方法,以這個委託為參數,然後在方法體裡調用這個委託,這樣一來,我不就把我想做,但不想具體去做的事委託出去了嗎?

pubilc void sos(helpme hm){
hm(10);
}

是的,這就是委託。

總結:

  • 聲明委託
delegate <return> <delegate-name> <parameter>
public delegate int MyDelegate (int s);
/<parameter>/<delegate-name>/<return>
  • 創建委託和在委託加入方法
MyDelegate ps = new MyDelegate(AddNum);
MyDelegate ps1 = new MyDelegate(AddNum1);
MyDelegate ps2 = new MyDelegate(AddNum2);
ps = ps+ps1;
ps += ps2;
  • 使用委託
ps(1);
#會依次調用AddNum、AddNum1、AddNum2方法。


分享到:


相關文章: