2015年8月3日 星期一

[UWP-C#] Delegate - 委派型別

Delegate,委派型別,你可以把它當成用來儲存事件的資料型態。

舉例來說,我們都知道int是儲存整數的資料型態,而String是用來儲存字串的資料型態。

而Delegate是用來儲存事件的資料型態,看完這句話後在來看以下的程式碼。

private int i;
//存放整數的資料型態
private String strs;
//存放字串的資料型態
private delegate void delegateTest();
//存放無回傳值 無傳入值的方法
view raw .cs hosted with ❤ by GitHub
是不是比較能理解了,前兩個是很常見的儲存int及String的資料型態,而第三個是儲存沒有回傳值及沒有傳入值的方法。

那我們該怎麼使用這個Delegate呢,先產生一個符合條件(無回傳值 無傳入值)的方法。

private void A() {
System.Diagnostics.Debug.WriteLine("我是A");
}
view raw d2.cs hosted with ❤ by GitHub
接著就可以呼叫了,這裡整理出了三種用法。

//第一種 指定定義的方法
delegateTest d1 = A;
//指定d1要執行的方法為A
d1();
//印出 我是A
//第二種 直接實作方法
delegateTest d2 = delegate () {
System.Diagnostics.Debug.WriteLine("我是d2");
};
d2();
//印出 我是d2
//第三種 Expression Lambda 語法
delegateTest d3 = () => {System.Diagnostics.Debug.WriteLine("我是Lambda語法");};
d3();
//印出 我是Lambda語法
view raw d3.cs hosted with ❤ by GitHub
此外,也可以使用泛型(Generics)來定義你的Delegate方法,也就是使用角括號<T>。

當你要使用的時候在決定要丟入什麼樣的型態,就像下面這個例子。


private delegate TResult Func<TArg0, TResult>(TArg0 t0);
//存放回傳值TResult 傳入值TArg0的方法
private int M1(int a) {
return a;
}
private String M2(int b) {
return "M2";
}
view raw d4.cs hosted with ❤ by GitHub
代表我要給使用者定義兩個資料型態,TResult是回傳值,TArg0是輸入值,當使用者定義完之後就可以使用了,就像是下面的例子。
Func<int, int> f1 = M1;
//指定TArg0的型態為 int , TResult為 int
//此時你可以把它看成 private delegate int Func(int t0);
Func<int, String> f2 = M2;
//指定TArg0的型態為 int , TResult為 String
//此時你可以把它看成 private delegate String Func(int t0);
f2 = M1;
//錯誤 : 型態不符合
view raw d5.cs hosted with ❤ by GitHub

這樣一來你應該會對Delegate有一定的認識了。

沒有留言:

張貼留言