C# 委托 delegat
委托可以是相向的,可以传参数也可以有回传值。事件是单向的,
方法签名参数指定是object, EventArgs(或继承它的子类),回传指定是 void,没有回传值。
代码如下:
1 using System;
2
3 namespace DelegateTutorial
4 {
5 ///////////////////////////////////////////
6
7 public delegate string Method();
8
9 ///////////////////////////////////////////
10
11 public class ClassWithDelegate
12 {
13 public Method methodPointer;
14
15 public void print()
16 {
17 Console.WriteLine(methodPointer()); // 方法在这里没有实体
18 }
19 }
20
21 ///////////////////////////////////////////
22
23 class Program
24 {
25 public static void Main()
26 {
27 ClassWithDelegate myClass = new ClassWithDelegate();
28
29 myClass.methodPointer = MethodA; // 这里才实体化,用方法指针去理解委托,我喜欢这样写
30 // 上面写成这样也行: myClass.methodPointer = new Method(MethodA);
31 myClass.print();
32
33 myClass.methodPointer = MethodB;
34 myClass.print();
35
36 Console.ReadKey();
37 }
38
39 public static string MethodA()
40 {
41 return "Method A.";
42 }
43
44 private static string MethodB()
45 {
46 return "Method B.";
47 }
48 }
49 }
不用 protected virtual 不用继承,也可改变行为,而且是运行时。大家成年人不要 Hello World 了,看看实例,作为 Callback 用(详见 Bill Wagner, Effective C# (Addison-Wesley, 2005), p.129-131):
1 public delegate bool CancelProcess();
2
3 /// <summary>
4 /// 物料主数据列表
5 /// </summary>
6 public class ItemMasterRecords : Collection<ItemRecords>
7 {
8 // 省略....
9
10 ValidationErrors validationErrors;
11
12 /// <summary>
13 /// 验证所有数据
14 /// </summary>
15 /// <param name="isContinue">返回 bool 的取消动作委托方法</param>
16 public void validateItemMasterRecords(CancelProcess isCancel)
17 {
18 bool _isCancel = false;
19 foreach (ItemRecords item in this)
20 {
21 item.validate(validationErrors); // 单个物料的验证方法
22
23 foreach (CancelProcess ptr in isCancel.GetInvocationList())
24 // 多个地方发出取消指示也没问题
25 {
26 _isCancel |= ptr();
27 if (_isCancel)
28 {
29 this.validationErrors.Clear();
30 return;
31 }
32 }
33 }
34
35 }
36 }