C#中使用委托
C#中使用委托
在C#中可以將委托看作一種新的類型,它是用來定義需要用來傳遞的方法的簽名。類似于C++中的函數指針,它定義函數的輸入參數和輸出參數,是一批相似方法的代名詞。但是為了種種原因,例如代碼安全。所以 .Net Framework 在語法上不允許直接傳遞方法或叫函數,如果確實要這么處理,那就需要將方法包裝成為一個新類型(委托)對象中。委托是一種特殊的對象,其他的對象包含的是數據和方法。但委托包含的是方法的細節。
我們通常習慣于向一個方法傳遞數值或對象,但是有時我們也希望向這個方法傳遞另一個方法,但這個方法的名稱在設計時卻是不確定的,只有到了運行時才能確定。這時就可以把要傳遞的方法用委托來定義,在使用時要把他看作是一個方法的代名詞。
使用委托的步驟:
1、聲明委托,定義參數列表和返回類型。
2、實例化委托,同時將一個符合委托聲明參數的方法名稱傳遞給委托。
3、調用委托,簡單來說就象使用方法一樣來使用委托的實例。
如下例:
?1?using?System;
?2?using?System.Collections;
?3?
?4?namespace?Exam
?5?{
?6?????//?自定義類
?7?????public?class?Class1
?8?????{
?9?????????private?string?name;
10?????????public?string?Name
11?????????{
12?????????????set?{?name?=?value;?}
13?????????????get?{?return?name;?}
14?????????}
15?????}
16?
17?????//?聲明一個委托用來代表所有輸入參數是Class1,輸出參數是string的方法。
18?????public?delegate?string?Delegate(Class1?cls);
19?
20?????class?Class2
21?????{
22?????????[STAThread]
23?????????static?void?Main(string[]?args)
24?????????{
25?????????????//?實例化委托,同時指定這個委托實例所代表的方法名就是這個類
26?????????????//?的一個靜態方法getName,注意這里不需要指定方法的參數。
27?????????????Delegate?test?=?new?Delegate(getName);
28?
29?????????????Class1?c1?=?new?Class1();
30?????????????c1.Name?=?"Class1";
31?
32?????????????//?調用委托test所代表的方法,同時傳遞他需要的參數c1。
33?????????????Console.WriteLine(test(c1));
34?
35?????????????Console.ReadKey();
36?????????}
37?
38?????????static?string?getName(Class1?cls)
39?????????{
40?????????????return?cls.Name;
41?????????}
42?????}
43?}
44?
最后,委托的實例可以表示任何類型的任何對象上的實例方法或靜態方法,只要方法簽名和委托簽名相同即可。
多播委托
上面使用的委托只包含了一個方法,調用委托時執行方法的次數也只有一次。其實,如果一個委托它的返回值是 void 那么編譯器就自動把它當作一個多播委托來處理。什么意思呢?也就是可以使用 += 方法向這個委托的實例添加其他方法。那么在使用這個實例時就會執行它所代表的所有方法。
例如:
?1?using?System;
?2?using?System.Collections;
?3?
?4?namespace?Exam
?5?{
?6?????//?無返回值的委托是多播委托
?7?????public?delegate?void?CountMethodDelegate(int?a,?int?b);
?8?
?9?????class?Class1
10?????{
11?
12?????????//?加法
13?????????static?void?Plus(int?a,?int?b)
14?????????{
15?????????????Console.WriteLine(String.Format("A:{0}?+?B:{1}?=?{2}",a,b,a+b));
16?????????}
17?
18?????????//?減法
19?????????static?void?Minus(int?a,?int?b)
20?????????{
21?????????????Console.WriteLine(String.Format("A:{0}?-?B:{1}?=?{2}",?a,?b,?a?-?b));
22?????????}
23?
24?????????//?乘法
25?????????static?void?Multiply(int?a,?int?b)
26?????????{
27?????????????Console.WriteLine(String.Format("A:{0}?*?B:{1}?=?{2}",?a,?b,?a?*?b));
28?????????}
29?????????
30?????????//?除法
31?????????static?void?Divide(int?a,?int?b)
32?????????{
33?????????????Console.WriteLine(String.Format("A:{0}?/?B:{1}?=?{2}",?a,?b,?a?/?b));
34?????????}
35?
36?????????[STAThread]
37?????????static?void?Main(string[]?args)
38?????????{
39?????????????int?A,?B;
40?????????????A?=?100;
41?????????????B?=?7;
42?
43?????????????//?連續向這個委托的實例添加方法。
44?????????????CountMethodDelegate?test?=?new?CountMethodDelegate(Plus);
45?????????????test?+=?new?CountMethodDelegate(Minus);
46?????????????test?+=?new?CountMethodDelegate(Multiply);
47?????????????test?+=?new?CountMethodDelegate(Divide);
48?
49?
50?????????????//?調用委托test所代表的方法,同時傳遞他需要的參數A和B。
51?????????????//?一次調用,執行所有方法。
52?????????????test(A,?B);
53?
54?????????????Console.ReadKey();
55?????????}
56?????}
57?}
58?
多播委托是一個派生于 System.MulticastDelegate 的類,它派生于基類 System.Delegate。它的其他成員允許把多個方法調用鏈接在一起,成為一個列表。但這并不代表執行這些方法的順序會按照添加時的順序執行,要避免編寫依賴特定順序調用方法的代碼。
洪虎
2006-10-2 更新
在C#中可以將委托看作一種新的類型,它是用來定義需要用來傳遞的方法的簽名。類似于C++中的函數指針,它定義函數的輸入參數和輸出參數,是一批相似方法的代名詞。但是為了種種原因,例如代碼安全。所以 .Net Framework 在語法上不允許直接傳遞方法或叫函數,如果確實要這么處理,那就需要將方法包裝成為一個新類型(委托)對象中。委托是一種特殊的對象,其他的對象包含的是數據和方法。但委托包含的是方法的細節。
我們通常習慣于向一個方法傳遞數值或對象,但是有時我們也希望向這個方法傳遞另一個方法,但這個方法的名稱在設計時卻是不確定的,只有到了運行時才能確定。這時就可以把要傳遞的方法用委托來定義,在使用時要把他看作是一個方法的代名詞。
使用委托的步驟:
1、聲明委托,定義參數列表和返回類型。
2、實例化委托,同時將一個符合委托聲明參數的方法名稱傳遞給委托。
3、調用委托,簡單來說就象使用方法一樣來使用委托的實例。
如下例:
?1?using?System;
?2?using?System.Collections;
?3?
?4?namespace?Exam
?5?{
?6?????//?自定義類
?7?????public?class?Class1
?8?????{
?9?????????private?string?name;
10?????????public?string?Name
11?????????{
12?????????????set?{?name?=?value;?}
13?????????????get?{?return?name;?}
14?????????}
15?????}
16?
17?????//?聲明一個委托用來代表所有輸入參數是Class1,輸出參數是string的方法。
18?????public?delegate?string?Delegate(Class1?cls);
19?
20?????class?Class2
21?????{
22?????????[STAThread]
23?????????static?void?Main(string[]?args)
24?????????{
25?????????????//?實例化委托,同時指定這個委托實例所代表的方法名就是這個類
26?????????????//?的一個靜態方法getName,注意這里不需要指定方法的參數。
27?????????????Delegate?test?=?new?Delegate(getName);
28?
29?????????????Class1?c1?=?new?Class1();
30?????????????c1.Name?=?"Class1";
31?
32?????????????//?調用委托test所代表的方法,同時傳遞他需要的參數c1。
33?????????????Console.WriteLine(test(c1));
34?
35?????????????Console.ReadKey();
36?????????}
37?
38?????????static?string?getName(Class1?cls)
39?????????{
40?????????????return?cls.Name;
41?????????}
42?????}
43?}
44?
最后,委托的實例可以表示任何類型的任何對象上的實例方法或靜態方法,只要方法簽名和委托簽名相同即可。
多播委托
上面使用的委托只包含了一個方法,調用委托時執行方法的次數也只有一次。其實,如果一個委托它的返回值是 void 那么編譯器就自動把它當作一個多播委托來處理。什么意思呢?也就是可以使用 += 方法向這個委托的實例添加其他方法。那么在使用這個實例時就會執行它所代表的所有方法。
例如:
?1?using?System;
?2?using?System.Collections;
?3?
?4?namespace?Exam
?5?{
?6?????//?無返回值的委托是多播委托
?7?????public?delegate?void?CountMethodDelegate(int?a,?int?b);
?8?
?9?????class?Class1
10?????{
11?
12?????????//?加法
13?????????static?void?Plus(int?a,?int?b)
14?????????{
15?????????????Console.WriteLine(String.Format("A:{0}?+?B:{1}?=?{2}",a,b,a+b));
16?????????}
17?
18?????????//?減法
19?????????static?void?Minus(int?a,?int?b)
20?????????{
21?????????????Console.WriteLine(String.Format("A:{0}?-?B:{1}?=?{2}",?a,?b,?a?-?b));
22?????????}
23?
24?????????//?乘法
25?????????static?void?Multiply(int?a,?int?b)
26?????????{
27?????????????Console.WriteLine(String.Format("A:{0}?*?B:{1}?=?{2}",?a,?b,?a?*?b));
28?????????}
29?????????
30?????????//?除法
31?????????static?void?Divide(int?a,?int?b)
32?????????{
33?????????????Console.WriteLine(String.Format("A:{0}?/?B:{1}?=?{2}",?a,?b,?a?/?b));
34?????????}
35?
36?????????[STAThread]
37?????????static?void?Main(string[]?args)
38?????????{
39?????????????int?A,?B;
40?????????????A?=?100;
41?????????????B?=?7;
42?
43?????????????//?連續向這個委托的實例添加方法。
44?????????????CountMethodDelegate?test?=?new?CountMethodDelegate(Plus);
45?????????????test?+=?new?CountMethodDelegate(Minus);
46?????????????test?+=?new?CountMethodDelegate(Multiply);
47?????????????test?+=?new?CountMethodDelegate(Divide);
48?
49?
50?????????????//?調用委托test所代表的方法,同時傳遞他需要的參數A和B。
51?????????????//?一次調用,執行所有方法。
52?????????????test(A,?B);
53?
54?????????????Console.ReadKey();
55?????????}
56?????}
57?}
58?
多播委托是一個派生于 System.MulticastDelegate 的類,它派生于基類 System.Delegate。它的其他成員允許把多個方法調用鏈接在一起,成為一個列表。但這并不代表執行這些方法的順序會按照添加時的順序執行,要避免編寫依賴特定順序調用方法的代碼。
洪虎
2006-10-2 更新
轉載于:https://www.cnblogs.com/eric1394/archive/2006/10/02/520242.html
總結
- 上一篇: Java软件工程师面试常见问题集锦之一
- 下一篇: C# 导出 EXecl ,导出word,